Unverified Commit 9244f87d authored by Tristan-Wilson's avatar Tristan-Wilson Committed by GitHub

node, rpc: add ReadHeaderTimeout config option (#25338)

This change makes http.Server.ReadHeaderTimeout configurable separately
from ReadTimeout for RPC servers. The default is set to the same as
ReadTimeout, which in order to cause no change in existing deployments.
parent d804a59e
...@@ -41,6 +41,7 @@ func StartHTTPEndpoint(endpoint string, timeouts rpc.HTTPTimeouts, handler http. ...@@ -41,6 +41,7 @@ func StartHTTPEndpoint(endpoint string, timeouts rpc.HTTPTimeouts, handler http.
httpSrv := &http.Server{ httpSrv := &http.Server{
Handler: handler, Handler: handler,
ReadTimeout: timeouts.ReadTimeout, ReadTimeout: timeouts.ReadTimeout,
ReadHeaderTimeout: timeouts.ReadHeaderTimeout,
WriteTimeout: timeouts.WriteTimeout, WriteTimeout: timeouts.WriteTimeout,
IdleTimeout: timeouts.IdleTimeout, IdleTimeout: timeouts.IdleTimeout,
} }
...@@ -75,6 +76,10 @@ func CheckTimeouts(timeouts *rpc.HTTPTimeouts) { ...@@ -75,6 +76,10 @@ func CheckTimeouts(timeouts *rpc.HTTPTimeouts) {
log.Warn("Sanitizing invalid HTTP read timeout", "provided", timeouts.ReadTimeout, "updated", rpc.DefaultHTTPTimeouts.ReadTimeout) log.Warn("Sanitizing invalid HTTP read timeout", "provided", timeouts.ReadTimeout, "updated", rpc.DefaultHTTPTimeouts.ReadTimeout)
timeouts.ReadTimeout = rpc.DefaultHTTPTimeouts.ReadTimeout timeouts.ReadTimeout = rpc.DefaultHTTPTimeouts.ReadTimeout
} }
if timeouts.ReadHeaderTimeout < time.Second {
log.Warn("Sanitizing invalid HTTP read header timeout", "provided", timeouts.ReadHeaderTimeout, "updated", rpc.DefaultHTTPTimeouts.ReadHeaderTimeout)
timeouts.ReadHeaderTimeout = rpc.DefaultHTTPTimeouts.ReadHeaderTimeout
}
if timeouts.WriteTimeout < time.Second { if timeouts.WriteTimeout < time.Second {
log.Warn("Sanitizing invalid HTTP write timeout", "provided", timeouts.WriteTimeout, "updated", rpc.DefaultHTTPTimeouts.WriteTimeout) log.Warn("Sanitizing invalid HTTP write timeout", "provided", timeouts.WriteTimeout, "updated", rpc.DefaultHTTPTimeouts.WriteTimeout)
timeouts.WriteTimeout = rpc.DefaultHTTPTimeouts.WriteTimeout timeouts.WriteTimeout = rpc.DefaultHTTPTimeouts.WriteTimeout
......
...@@ -134,6 +134,7 @@ func (h *httpServer) start() error { ...@@ -134,6 +134,7 @@ func (h *httpServer) start() error {
if h.timeouts != (rpc.HTTPTimeouts{}) { if h.timeouts != (rpc.HTTPTimeouts{}) {
CheckTimeouts(&h.timeouts) CheckTimeouts(&h.timeouts)
h.server.ReadTimeout = h.timeouts.ReadTimeout h.server.ReadTimeout = h.timeouts.ReadTimeout
h.server.ReadHeaderTimeout = h.timeouts.ReadHeaderTimeout
h.server.WriteTimeout = h.timeouts.WriteTimeout h.server.WriteTimeout = h.timeouts.WriteTimeout
h.server.IdleTimeout = h.timeouts.IdleTimeout h.server.IdleTimeout = h.timeouts.IdleTimeout
} }
......
...@@ -87,6 +87,14 @@ type HTTPTimeouts struct { ...@@ -87,6 +87,14 @@ type HTTPTimeouts struct {
// ReadHeaderTimeout. It is valid to use them both. // ReadHeaderTimeout. It is valid to use them both.
ReadTimeout time.Duration ReadTimeout time.Duration
// 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 ReadHeaderTimeout
// is zero, the value of ReadTimeout is used. If both are
// zero, there is no timeout.
ReadHeaderTimeout time.Duration
// WriteTimeout is the maximum duration before timing out // WriteTimeout is the maximum duration before timing out
// writes of the response. It is reset whenever a new // writes of the response. It is reset whenever a new
// request's header is read. Like ReadTimeout, it does not // request's header is read. Like ReadTimeout, it does not
...@@ -104,6 +112,7 @@ type HTTPTimeouts struct { ...@@ -104,6 +112,7 @@ type HTTPTimeouts struct {
// configuration is not provided. // configuration is not provided.
var DefaultHTTPTimeouts = HTTPTimeouts{ var DefaultHTTPTimeouts = HTTPTimeouts{
ReadTimeout: 30 * time.Second, ReadTimeout: 30 * time.Second,
ReadHeaderTimeout: 30 * time.Second,
WriteTimeout: 30 * time.Second, WriteTimeout: 30 * time.Second,
IdleTimeout: 120 * time.Second, IdleTimeout: 120 * time.Second,
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment