1
0
mirror of https://github.com/golang/go synced 2024-11-18 00:54:45 -07:00

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 <iant@golang.org>
This commit is contained in:
Brad Fitzpatrick 2016-11-11 18:43:39 +00:00
parent 39e3cbfff6
commit 9f9d83404f
2 changed files with 8 additions and 3 deletions

View 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)

View 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 {