diff --git a/lib/settings/bind.go b/lib/settings/bind.go index ae3f0ac..ca3e5cc 100644 --- a/lib/settings/bind.go +++ b/lib/settings/bind.go @@ -14,6 +14,7 @@ import ( "os" "strconv" "sync/atomic" + "time" ) type Bind struct { @@ -31,6 +32,37 @@ type Bind struct { TLSCertificate string `yaml:"tls-certificate"` // TLSPrivateKey Alternate to TLSAcmeAutoCert TLSPrivateKey string `yaml:"tls-key"` + + // ReadTimeout is the maximum duration for reading the entire + // request, including the body. A zero or negative value means + // there will be no timeout. + // + // Because ReadTimeout does not let Handlers make per-request + // decisions on each request body's acceptable deadline or + // upload rate, most users will prefer to use + // ReadHeaderTimeout. It is valid to use them both. + ReadTimeout time.Duration `yaml:"read-timeout"` + + // ReadHeaderTimeout is the amount of time allowed to read + // request headers. The connection's read deadline is reset + // after reading the headers and the Handler can decide what + // is considered too slow for the body. If zero, the value of + // ReadTimeout is used. If negative, or if zero and ReadTimeout + // is zero or negative, there is no timeout. + ReadHeaderTimeout time.Duration `yaml:"read-header-timeout"` + + // WriteTimeout is the maximum duration before timing out + // writes of the response. It is reset whenever a new + // request's header is read. Like ReadTimeout, it does not + // let Handlers make decisions on a per-request basis. + // A zero or negative value means there will be no timeout. + WriteTimeout time.Duration `yaml:"write-timeout"` + + // IdleTimeout is the maximum amount of time to wait for the + // next request when keep-alives are enabled. If zero, the value + // of ReadTimeout is used. If negative, or if zero and ReadTimeout + // is zero or negative, there is no timeout. + IdleTimeout time.Duration `yaml:"idle-timeout"` } func (b *Bind) Listener() (net.Listener, string) { @@ -83,6 +115,11 @@ func (b *Bind) Server(backends map[string]http.Handler, acmeCachePath string) (* } }), tlsConfig) + server.ReadTimeout = b.ReadTimeout + server.ReadHeaderTimeout = b.ReadHeaderTimeout + server.WriteTimeout = b.WriteTimeout + server.IdleTimeout = b.IdleTimeout + swap := func(handler http.Handler) { serverHandler.Store(&handler) }