package config import ( "log" "time" ) // HTTPConfig controls built-in HTTP servers. Positive values override the // selected transport's defaults; zero keeps its existing behavior. Timeouts // follow that transport's semantics, not a handler execution deadline. type HTTPConfig struct { ReadHeaderTimeout time.Duration `json:"readHeaderTimeout"` ReadTimeout time.Duration `json:"readTimeout"` WriteTimeout time.Duration `json:"writeTimeout"` IdleTimeout time.Duration `json:"idleTimeout"` MaxHeaderBytes int `json:"maxHeaderBytes"` // ErrorLog is a Go-only hook for the nethttp server's internal diagnostics. ErrorLog *log.Logger `json:"-"` } func (c HTTPConfig) Validate() error { for _, field := range []struct { name string value time.Duration }{ {"readHeaderTimeout", c.ReadHeaderTimeout}, {"readTimeout", c.ReadTimeout}, {"writeTimeout", c.WriteTimeout}, {"idleTimeout", c.IdleTimeout}, } { if field.value < 0 { return &ConfigError{Field: "http." + field.name, Message: "must be nonnegative"} } } if c.MaxHeaderBytes < 0 { return &ConfigError{Field: "http.maxHeaderBytes", Message: "must be nonnegative"} } return nil } // WithHTTPConfig sets the built-in server's HTTP options. RunWith uses a // caller-owned Runner and does not apply these options to that runner. func WithHTTPConfig(settings HTTPConfig) Option { return func(cfg *Config) { cfg.HTTP = settings } }