]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: make Server cancel its ReadTimeout between requests
authorBrad Fitzpatrick <bradfitz@golang.org>
Wed, 4 Jan 2017 21:03:24 +0000 (21:03 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Wed, 4 Jan 2017 21:17:22 +0000 (21:17 +0000)
Fixes #18447

Change-Id: I5d60c3632a5ce625d3bac9d85533ce689e301707
Reviewed-on: https://go-review.googlesource.com/34813
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/net/http/serve_test.go
src/net/http/server.go

index d8561f7c7f0d045b5bd00e97d969fde9e1b75556..c2be58108b02b4175813db00701d781409106d98 100644 (file)
@@ -5089,3 +5089,40 @@ func testServerKeepAlivesEnabled(t *testing.T, h2 bool) {
                t.Fatalf("test server has active conns")
        }
 }
+
+// Issue 18447: test that the Server's ReadTimeout is stopped while
+// the server's doing its 1-byte background read between requests,
+// waiting for the connection to maybe close.
+func TestServerCancelsReadTimeoutWhenIdle(t *testing.T) {
+       setParallel(t)
+       defer afterTest(t)
+       const timeout = 250 * time.Millisecond
+       ts := httptest.NewUnstartedServer(HandlerFunc(func(w ResponseWriter, r *Request) {
+               select {
+               case <-time.After(2 * timeout):
+                       fmt.Fprint(w, "ok")
+               case <-r.Context().Done():
+                       fmt.Fprint(w, r.Context().Err())
+               }
+       }))
+       ts.Config.ReadTimeout = timeout
+       ts.Start()
+       defer ts.Close()
+
+       tr := &Transport{}
+       defer tr.CloseIdleConnections()
+       c := &Client{Transport: tr}
+
+       res, err := c.Get(ts.URL)
+       if err != nil {
+               t.Fatal(err)
+       }
+       slurp, err := ioutil.ReadAll(res.Body)
+       res.Body.Close()
+       if err != nil {
+               t.Fatal(err)
+       }
+       if string(slurp) != "ok" {
+               t.Fatalf("Got: %q, want ok", slurp)
+       }
+}
index 6df9c260e4a37c33885826d23988fa2c5e659b9a..bf1014134c9bc6a7924c76767744645fa6d6e18c 100644 (file)
@@ -637,6 +637,7 @@ func (cr *connReader) startBackgroundRead() {
                panic("invalid concurrent Body.Read call")
        }
        cr.inRead = true
+       cr.conn.rwc.SetReadDeadline(time.Time{})
        go cr.backgroundRead()
 }