From 9f9d83404f938a0dfb98d3f4a4d420261606069a Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Fri, 11 Nov 2016 18:43:39 +0000 Subject: [PATCH] net/http: make Server respect shutdown state after handler finishes If the Server's Shutdown (or SetKeepAlivesEnabled) method was called while a connection was in a Handler, but after the headers had been written, the connection was not later closed. Fixes #9478 Updates #17754 (reverts that workaround) Change-Id: I65324ab8217373fbb38e12e2b8bffd0a91806072 Reviewed-on: https://go-review.googlesource.com/33141 Reviewed-by: Ian Lance Taylor --- src/net/http/serve_test.go | 3 --- src/net/http/server.go | 8 ++++++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/net/http/serve_test.go b/src/net/http/serve_test.go index fd2dd6cea5..6b450d41e3 100644 --- a/src/net/http/serve_test.go +++ b/src/net/http/serve_test.go @@ -4943,9 +4943,6 @@ func TestServerSetKeepAlivesEnabledClosesConns(t *testing.T) { }) { t.Fatalf("idle count before SetKeepAlivesEnabled called = %v; want 1", idle0) } - if !waitCondition(2*time.Second, 10*time.Millisecond, ts.Config.ExportAllConnsIdle) { - t.Fatalf("test server has active conns") - } ts.Config.SetKeepAlivesEnabled(false) diff --git a/src/net/http/server.go b/src/net/http/server.go index 8a79a6c6a4..be76c6a9c0 100644 --- a/src/net/http/server.go +++ b/src/net/http/server.go @@ -1827,6 +1827,14 @@ func (c *conn) serve(ctx context.Context) { c.setState(c.rwc, StateIdle) c.curReq.Store((*response)(nil)) + if !w.conn.server.doKeepAlives() { + // We're in shutdown mode. We might've replied + // to the user without "Connection: close" and + // they might think they can send another + // request, but such is life with HTTP/1.1. + return + } + if d := c.server.idleTimeout(); d != 0 { c.rwc.SetReadDeadline(time.Now().Add(d)) if _, err := c.bufr.Peek(4); err != nil {