]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: make Server respect shutdown state after handler finishes
authorBrad Fitzpatrick <bradfitz@golang.org>
Fri, 11 Nov 2016 18:43:39 +0000 (18:43 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Fri, 11 Nov 2016 19:56:12 +0000 (19:56 +0000)
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 <iant@golang.org>
src/net/http/serve_test.go
src/net/http/server.go

index fd2dd6cea5a283f4dca091ebfc5871003bb4189f..6b450d41e3c1f31ecd647c2a3312dc6c1e404b66 100644 (file)
@@ -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)
 
index 8a79a6c6a4b451041ad79edf19ea38deb04f6494..be76c6a9c0032fec3195546cfcd290e5b43f95c3 100644 (file)
@@ -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 {