]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: add test confirming a connection reuse case
authorBrad Fitzpatrick <bradfitz@golang.org>
Wed, 18 May 2016 00:35:43 +0000 (00:35 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Wed, 18 May 2016 01:24:02 +0000 (01:24 +0000)
Verify that for a server doing chunked encoding, with the final data
and EOF arriving together, the client will reuse the connection even
if it closes the body without seeing an EOF. The server sends at least
one non-zero chunk and one zero chunk. This verifies that the client's
bufio reading reads ahead and notes the EOF, so even if the JSON
decoder doesn't read the EOF itself, as long as somebody sees it, a
close won't forcible tear down the connection. This was true at least
of https://golang.org/cl/21291

No code change. Test already passed (even with lots of runs, including
in race mode with randomized goroutine scheduling).

Updates #15703

Change-Id: I2140b3eec6b099b6b6e54f153fe271becac5d949
Reviewed-on: https://go-review.googlesource.com/23200
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Andrew Gerrand <adg@golang.org>
src/net/http/serve_test.go

index 95983e4b02e75684f8bc3e05a96a84f5ba217c9c..e398c92638eb24acd326f79156ece7864ae35cc7 100644 (file)
@@ -11,6 +11,7 @@ import (
        "bytes"
        "context"
        "crypto/tls"
+       "encoding/json"
        "errors"
        "fmt"
        "internal/testenv"
@@ -792,6 +793,36 @@ func TestHTTP10KeepAlive304Response(t *testing.T) {
                HandlerFunc(send304))
 }
 
+// Issue 15703
+func TestKeepAliveFinalChunkWithEOF(t *testing.T) {
+       defer afterTest(t)
+       cst := newClientServerTest(t, false /* h1 */, HandlerFunc(func(w ResponseWriter, r *Request) {
+               w.(Flusher).Flush() // force chunked encoding
+               w.Write([]byte("{\"Addr\": \"" + r.RemoteAddr + "\"}"))
+       }))
+       defer cst.close()
+       type data struct {
+               Addr string
+       }
+       var addrs [2]data
+       for i := range addrs {
+               res, err := cst.c.Get(cst.ts.URL)
+               if err != nil {
+                       t.Fatal(err)
+               }
+               if err := json.NewDecoder(res.Body).Decode(&addrs[i]); err != nil {
+                       t.Fatal(err)
+               }
+               if addrs[i].Addr == "" {
+                       t.Fatal("no address")
+               }
+               res.Body.Close()
+       }
+       if addrs[0] != addrs[1] {
+               t.Fatalf("connection not reused")
+       }
+}
+
 func TestSetsRemoteAddr_h1(t *testing.T) { testSetsRemoteAddr(t, h1Mode) }
 func TestSetsRemoteAddr_h2(t *testing.T) { testSetsRemoteAddr(t, h2Mode) }