Skip to content

Commit 2ce0a22

Browse files
authored
cmd, node, rpc: add ReadHeaderTimeout config option ethereum#25338 (#972)
1 parent 94b3ca1 commit 2ce0a22

File tree

5 files changed

+28
-4
lines changed

5 files changed

+28
-4
lines changed

cmd/XDC/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ var (
147147
utils.HTTPListenAddrFlag,
148148
utils.HTTPPortFlag,
149149
utils.HTTPReadTimeoutFlag,
150+
utils.HTTPReadHeaderTimeoutFlag,
150151
utils.HTTPWriteTimeoutFlag,
151152
utils.HTTPIdleTimeoutFlag,
152153
utils.HTTPApiFlag,

cmd/utils/flags.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,12 @@ var (
476476
Value: rpc.DefaultHTTPTimeouts.ReadTimeout,
477477
Category: flags.APICategory,
478478
}
479+
HTTPReadHeaderTimeoutFlag = &cli.DurationFlag{
480+
Name: "http-readheadertimeout",
481+
Usage: "HTTP-RPC server read timeout",
482+
Value: rpc.DefaultHTTPTimeouts.ReadHeaderTimeout,
483+
Category: flags.APICategory,
484+
}
479485
HTTPWriteTimeoutFlag = &cli.DurationFlag{
480486
Name: "http-writetimeout",
481487
Aliases: []string{"rpcwritetimeout"},
@@ -999,6 +1005,9 @@ func setHTTP(ctx *cli.Context, cfg *node.Config) {
9991005
if ctx.IsSet(HTTPReadTimeoutFlag.Name) {
10001006
cfg.HTTPTimeouts.ReadTimeout = ctx.Duration(HTTPReadTimeoutFlag.Name)
10011007
}
1008+
if ctx.IsSet(HTTPReadHeaderTimeoutFlag.Name) {
1009+
cfg.HTTPTimeouts.ReadHeaderTimeout = ctx.Duration(HTTPReadHeaderTimeoutFlag.Name)
1010+
}
10021011
if ctx.IsSet(HTTPWriteTimeoutFlag.Name) {
10031012
cfg.HTTPTimeouts.WriteTimeout = ctx.Duration(HTTPWriteTimeoutFlag.Name)
10041013
}

node/endpoints.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ func CheckTimeouts(timeouts *rpc.HTTPTimeouts) {
4848
log.Warn("Sanitizing invalid HTTP read timeout", "provided", timeouts.ReadTimeout, "updated", rpc.DefaultHTTPTimeouts.ReadTimeout)
4949
timeouts.ReadTimeout = rpc.DefaultHTTPTimeouts.ReadTimeout
5050
}
51+
if timeouts.ReadHeaderTimeout < time.Second {
52+
log.Warn("Sanitizing invalid HTTP read header timeout", "provided", timeouts.ReadHeaderTimeout, "updated", rpc.DefaultHTTPTimeouts.ReadHeaderTimeout)
53+
timeouts.ReadHeaderTimeout = rpc.DefaultHTTPTimeouts.ReadHeaderTimeout
54+
}
5155
if timeouts.WriteTimeout < 2*time.Second {
5256
log.Warn("Sanitizing invalid HTTP write timeout", "provided", timeouts.WriteTimeout, "updated", rpc.DefaultHTTPTimeouts.WriteTimeout)
5357
timeouts.WriteTimeout = rpc.DefaultHTTPTimeouts.WriteTimeout

node/rpcstack.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,11 @@ func (h *httpServer) start() error {
125125
h.server = &http.Server{Handler: h}
126126
if h.timeouts != (rpc.HTTPTimeouts{}) {
127127
h.server.ReadTimeout = h.timeouts.ReadTimeout
128+
h.server.ReadHeaderTimeout = h.timeouts.ReadHeaderTimeout
128129
h.server.WriteTimeout = h.timeouts.WriteTimeout
129130
h.server.IdleTimeout = h.timeouts.IdleTimeout
130131
}
131-
log.Info("Start http server", "ReadTimeout", h.server.ReadTimeout, "WriteTimeout", h.server.WriteTimeout, "IdleTimeout", h.server.IdleTimeout)
132+
log.Info("Start http server", "ReadTimeout", h.server.ReadTimeout, "ReadHeaderTimeout", h.server.ReadHeaderTimeout, "WriteTimeout", h.server.WriteTimeout, "IdleTimeout", h.server.IdleTimeout)
132133
// Start the server.
133134
listener, err := net.Listen("tcp", h.endpoint)
134135
if err != nil {

rpc/http.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,14 @@ type HTTPTimeouts struct {
8787
// ReadHeaderTimeout. It is valid to use them both.
8888
ReadTimeout time.Duration
8989

90+
// ReadHeaderTimeout is the amount of time allowed to read
91+
// request headers. The connection's read deadline is reset
92+
// after reading the headers and the Handler can decide what
93+
// is considered too slow for the body. If ReadHeaderTimeout
94+
// is zero, the value of ReadTimeout is used. If both are
95+
// zero, there is no timeout.
96+
ReadHeaderTimeout time.Duration
97+
9098
// WriteTimeout is the maximum duration before timing out
9199
// writes of the response. It is reset whenever a new
92100
// request's header is read. Like ReadTimeout, it does not
@@ -103,9 +111,10 @@ type HTTPTimeouts struct {
103111
// DefaultHTTPTimeouts represents the default timeout values used if further
104112
// configuration is not provided.
105113
var DefaultHTTPTimeouts = HTTPTimeouts{
106-
ReadTimeout: 30 * time.Second,
107-
WriteTimeout: 30 * time.Second,
108-
IdleTimeout: 120 * time.Second,
114+
ReadTimeout: 30 * time.Second,
115+
ReadHeaderTimeout: 30 * time.Second,
116+
WriteTimeout: 30 * time.Second,
117+
IdleTimeout: 120 * time.Second,
109118
}
110119

111120
// DialHTTPWithClient creates a new RPC client that connects to an RPC server over HTTP

0 commit comments

Comments
 (0)