Commit f962e6e0 authored by Brad Fitzpatrick's avatar Brad Fitzpatrick

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 <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: 's avatarAndrew Gerrand <adg@golang.org>
parent 733162fd
......@@ -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) }
......
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