package config import ( "reflect" "time" ) // JSCKServerProxy is the server proxy section's configuration key. const JSCKServerProxy string = "proxy" // JSCServerProxy configures which proxies the server trusts and how it finds // the client's address behind them. TrustedProxies are IP addresses and CIDR // ranges; empty means no proxy is trusted. ClientIPHeaders are the headers // read for the client's address from a trusted proxy, in priority order; // empty means the connection's own address is always used. type JSCServerProxy struct { TrustedProxies []string `cfg:"trusted" default:"127.0.0.1/32"` ClientIPHeaders []string `cfg:"client_ip_headers" default:"X-Forwarded-For, Forwarded, X-Real-IP"` StripUntrusted bool `cfg:"strip_untrusted" default:"true"` ProxyProtocol JSCServerProxyProtocol `cfg:"proxy_protocol"` } // ---------- Section methods (see Section) ---------- // Map implements Section. func (c JSCServerProxy) Map() map[string]any { return mapOf(c) } // Flatten implements Section. func (c JSCServerProxy) Flatten() map[string]any { return flattenOf(JSCKServerProxy, c) } // TypeOf implements Section. func (c JSCServerProxy) TypeOf(key string) (reflect.Kind, error) { return typeOf(c, key) } // ValueOf implements Section. func (c JSCServerProxy) ValueOf(key string) (any, error) { return valueOf(c, key) } // SetValue implements Section. func (c *JSCServerProxy) SetValue(key string, value any) error { return setValue(c, key, value) } // ========== PROXY protocol ========== // JSCKServerProxyProtocol is the server proxy PROXY protocol section's // configuration key. const JSCKServerProxyProtocol string = "proxy_protocol" // JSCServerProxyProtocol configures accepting the PROXY protocol from // trusted proxies. TrustedSources may send PROXY headers; empty means // Proxy.TrustedProxies. ReadHeaderTimeout is how long to wait for the PROXY // header; 0 or less means no limit. type JSCServerProxyProtocol struct { Enabled bool `cfg:"enabled" default:"false"` TrustedSources []string `cfg:"trusted_sources"` Required bool `cfg:"required" default:"false"` ReadHeaderTimeout time.Duration `cfg:"read_header_timeout" default:"5s"` } // ---------- Section methods (see Section) ---------- // Map implements Section. func (c JSCServerProxyProtocol) Map() map[string]any { return mapOf(c) } // Flatten implements Section. func (c JSCServerProxyProtocol) Flatten() map[string]any { return flattenOf(JSCKServerProxyProtocol, c) } // TypeOf implements Section. func (c JSCServerProxyProtocol) TypeOf(key string) (reflect.Kind, error) { return typeOf(c, key) } // ValueOf implements Section. func (c JSCServerProxyProtocol) ValueOf(key string) (any, error) { return valueOf(c, key) } // SetValue implements Section. func (c *JSCServerProxyProtocol) SetValue(key string, value any) error { return setValue(c, key, value) }