From: Brad Fitzpatrick Date: Wed, 18 May 2016 00:35:43 +0000 (+0000) Subject: net/http: add test confirming a connection reuse case X-Git-Tag: go1.7beta1~188 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=f962e6e0e21b9e73981e6cf2407ea01fce04b989;p=gostls13.git net/http: add test confirming a connection reuse case 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 TryBot-Result: Gobot Gobot Reviewed-by: Andrew Gerrand --- diff --git a/src/net/http/serve_test.go b/src/net/http/serve_test.go index 95983e4b02..e398c92638 100644 --- a/src/net/http/serve_test.go +++ b/src/net/http/serve_test.go @@ -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) }