diff --git a/src/net/http/serve_test.go b/src/net/http/serve_test.go index 3bd3db4a69b..f3454848b75 100644 --- a/src/net/http/serve_test.go +++ b/src/net/http/serve_test.go @@ -3381,6 +3381,31 @@ func TestHandlerFinishSkipBigContentLengthRead(t *testing.T) { } } +func TestHandlerSetsBodyNil(t *testing.T) { + defer afterTest(t) + ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) { + r.Body = nil + fmt.Fprintf(w, "%v", r.RemoteAddr) + })) + defer ts.Close() + get := func() string { + res, err := Get(ts.URL) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Fatal(err) + } + return string(slurp) + } + a, b := get(), get() + if a != b { + t.Errorf("Failed to reuse connections between requests: %v vs %v", a, b) + } +} + func BenchmarkClientServer(b *testing.B) { b.ReportAllocs() b.StopTimer() diff --git a/src/net/http/server.go b/src/net/http/server.go index e8470efd6bd..979b2eb1e54 100644 --- a/src/net/http/server.go +++ b/src/net/http/server.go @@ -317,8 +317,9 @@ func (cw *chunkWriter) close() { type response struct { conn *conn req *Request // request for this response - wroteHeader bool // reply header has been (logically) written - wroteContinue bool // 100 Continue response was written + reqBody io.ReadCloser + wroteHeader bool // reply header has been (logically) written + wroteContinue bool // 100 Continue response was written w *bufio.Writer // buffers output in chunks to chunkWriter cw chunkWriter @@ -658,6 +659,7 @@ func (c *conn) readRequest() (w *response, err error) { w = &response{ conn: c, req: req, + reqBody: req.Body, handlerHeader: make(Header), contentLength: -1, } @@ -1167,7 +1169,7 @@ func (w *response) finishRequest() { // Close the body (regardless of w.closeAfterReply) so we can // re-use its bufio.Reader later safely. - w.req.Body.Close() + w.reqBody.Close() if w.req.MultipartForm != nil { w.req.MultipartForm.RemoveAll()