Commit 9f9d8340 authored by Brad Fitzpatrick's avatar Brad Fitzpatrick

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/33141Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
parent 39e3cbff
...@@ -4943,9 +4943,6 @@ func TestServerSetKeepAlivesEnabledClosesConns(t *testing.T) { ...@@ -4943,9 +4943,6 @@ func TestServerSetKeepAlivesEnabledClosesConns(t *testing.T) {
}) { }) {
t.Fatalf("idle count before SetKeepAlivesEnabled called = %v; want 1", idle0) 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) ts.Config.SetKeepAlivesEnabled(false)
......
...@@ -1827,6 +1827,14 @@ func (c *conn) serve(ctx context.Context) { ...@@ -1827,6 +1827,14 @@ func (c *conn) serve(ctx context.Context) {
c.setState(c.rwc, StateIdle) c.setState(c.rwc, StateIdle)
c.curReq.Store((*response)(nil)) 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 { if d := c.server.idleTimeout(); d != 0 {
c.rwc.SetReadDeadline(time.Now().Add(d)) c.rwc.SetReadDeadline(time.Now().Add(d))
if _, err := c.bufr.Peek(4); err != nil { if _, err := c.bufr.Peek(4); err != nil {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment