Files
sendico/api/pkg/api/routers/internal/grpcimp/config.go
2026-01-19 11:07:21 +01:00

92 lines
2.4 KiB
Go

package grpcimp
import (
"fmt"
"net"
"os"
"strings"
)
type Config struct {
Network string `yaml:"network"`
Address string `yaml:"address"`
AdvertiseHost string `yaml:"advertise_host"`
AdvertiseHostEnv string `yaml:"advertise_host_env"`
AdvertiseScheme string `yaml:"advertise_scheme"`
AdvertiseSchemeEnv string `yaml:"advertise_scheme_env"`
EnableReflection bool `yaml:"enable_reflection"`
EnableHealth bool `yaml:"enable_health"`
MaxRecvMsgSize int `yaml:"max_recv_msg_size"`
MaxSendMsgSize int `yaml:"max_send_msg_size"`
TLS *TLSConfig `yaml:"tls"`
}
type TLSConfig struct {
CertFile string `yaml:"cert_file"`
KeyFile string `yaml:"key_file"`
CAFile string `yaml:"ca_file"`
RequireClientCert bool `yaml:"require_client_cert"`
}
// DiscoveryInvokeURI builds a discovery invoke URI from the gRPC config.
func (c *Config) DiscoveryInvokeURI() string {
if c == nil {
return ""
}
address := strings.TrimSpace(c.Address)
addrHost, addrPort := splitHostPort(address)
host := strings.TrimSpace(c.AdvertiseHost)
if envKey := strings.TrimSpace(c.AdvertiseHostEnv); envKey != "" {
if value := strings.TrimSpace(os.Getenv(envKey)); value != "" {
host = value
}
}
if host != "" {
if parsedHost, parsedPort, err := net.SplitHostPort(host); err == nil && parsedPort != "" {
host = strings.TrimSpace(parsedHost)
addrPort = strings.TrimSpace(parsedPort)
}
}
if host == "" {
host = addrHost
}
if host == "" || host == "0.0.0.0" || host == "::" {
return ""
}
if addrPort == "" {
return ""
}
return fmt.Sprintf("%s://%s:%s", c.discoveryScheme(), host, addrPort)
}
func (c *Config) discoveryScheme() string {
scheme := strings.TrimSpace(c.AdvertiseScheme)
if envKey := strings.TrimSpace(c.AdvertiseSchemeEnv); envKey != "" {
if value := strings.TrimSpace(os.Getenv(envKey)); value != "" {
scheme = value
}
}
if scheme != "" {
return scheme
}
if c != nil && c.TLS != nil && strings.TrimSpace(c.TLS.CertFile) != "" && strings.TrimSpace(c.TLS.KeyFile) != "" {
return "grpcs"
}
return "grpc"
}
func splitHostPort(address string) (string, string) {
address = strings.TrimSpace(address)
if address == "" {
return "", ""
}
host, port, err := net.SplitHostPort(address)
if err != nil {
return "", ""
}
return strings.TrimSpace(host), strings.TrimSpace(port)
}