From 7346d20b8067f18a55ee56e9052c3fee8979edfa Mon Sep 17 00:00:00 2001 From: lesismal Date: Sat, 12 Mar 2022 18:50:16 +0800 Subject: [PATCH] net/http: fix zombie connection leaked When `Server.IdleTimeout` is not zero and after the first request, the client sends part of the data of a full request, and the data is no less than 4 bytes, the idle timeout which has been set will be reset to zero here and would never close the conn: https://github.com/golang/go/blob/master/src/net/http/server.go#L1996 --- src/net/http/server.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/net/http/server.go b/src/net/http/server.go index ffb742ba4ad2ea..49147a9d7a611c 100644 --- a/src/net/http/server.go +++ b/src/net/http/server.go @@ -968,6 +968,9 @@ func (c *conn) readRequest(ctx context.Context) (w *response, err error) { t0 := time.Now() if d := c.server.readHeaderTimeout(); d > 0 { hdrDeadline = t0.Add(d) + } else { + const headerTimeout = 30 * time.Second + hdrDeadline = t0.Add(headerTimeout) } if d := c.server.ReadTimeout; d > 0 { wholeReqDeadline = t0.Add(d) @@ -1993,7 +1996,6 @@ func (c *conn) serve(ctx context.Context) { return } } - c.rwc.SetReadDeadline(time.Time{}) } }