38 lines
894 B
Go
38 lines
894 B
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"net/netip"
|
|
|
|
"go.uber.org/multierr"
|
|
)
|
|
|
|
type ServerConfig struct {
|
|
Address string `yaml:"address"`
|
|
|
|
// TrustedProxies lists IPs/CIDRs (e.g. of a fronting nginx) allowed to set
|
|
// X-Forwarded-For/X-Real-IP when gin resolves the client IP. Empty means no
|
|
// forwarded header is trusted, and the raw remote address is used instead.
|
|
TrustedProxies []string `yaml:"trusted_proxies"`
|
|
}
|
|
|
|
func (sc *ServerConfig) Validate() error {
|
|
var err error
|
|
|
|
if sc.Address == "" {
|
|
err = multierr.Append(err, fmt.Errorf("address is missing"))
|
|
}
|
|
|
|
for _, proxy := range sc.TrustedProxies {
|
|
if _, parseErr := netip.ParsePrefix(proxy); parseErr == nil {
|
|
continue
|
|
}
|
|
if _, parseErr := netip.ParseAddr(proxy); parseErr == nil {
|
|
continue
|
|
}
|
|
err = multierr.Append(err, fmt.Errorf("invalid trusted_proxies entry %q: must be an IP or CIDR", proxy))
|
|
}
|
|
|
|
return err
|
|
}
|