From fae8e09d26f3bb065475abd44b47f54e25179cdc Mon Sep 17 00:00:00 2001 From: Damien Neil Date: Thu, 11 Jun 2020 13:30:23 -0700 Subject: [PATCH] [release-branch.go1.14] net/http: make Transport.RoundTrip preserve Requests Ensure that the exact Request passed to Transport.RoundTrip is returned in the Response. Do not replace the Request with a copy when resetting the request body. Updates #39533. Fixes #40973. Change-Id: Ie6fb080c24b0f6625b0761b7aa542af3d2411817 Reviewed-on: https://go-review.googlesource.com/c/go/+/237560 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Russ Cox Reviewed-on: https://go-review.googlesource.com/c/go/+/249880 Run-TryBot: Dmitri Shuralyov Reviewed-by: Damien Neil --- src/net/http/transport.go | 2 ++ src/net/http/transport_test.go | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/net/http/transport.go b/src/net/http/transport.go index 0f9001062a..5a77e91368 100644 --- a/src/net/http/transport.go +++ b/src/net/http/transport.go @@ -511,6 +511,7 @@ func (t *Transport) roundTrip(req *Request) (*Response, error) { } } + origReq := req req = setupRewindBody(req) if altRT := t.alternateRoundTripper(req); altRT != nil { @@ -572,6 +573,7 @@ func (t *Transport) roundTrip(req *Request) (*Response, error) { resp, err = pconn.roundTrip(treq) } if err == nil { + resp.Request = origReq return resp, nil } diff --git a/src/net/http/transport_test.go b/src/net/http/transport_test.go index 2c8ae9c7ac..ba12e834c5 100644 --- a/src/net/http/transport_test.go +++ b/src/net/http/transport_test.go @@ -3490,7 +3490,8 @@ func TestRetryRequestsOnError(t *testing.T) { for i := 0; i < 3; i++ { t0 := time.Now() - res, err := c.Do(tc.req()) + req := tc.req() + res, err := c.Do(req) if err != nil { if time.Since(t0) < MaxWriteWaitBeforeConnReuse/2 { mu.Lock() @@ -3501,6 +3502,9 @@ func TestRetryRequestsOnError(t *testing.T) { t.Skipf("connection likely wasn't recycled within %d, interfering with actual test; skipping", MaxWriteWaitBeforeConnReuse) } res.Body.Close() + if res.Request != req { + t.Errorf("Response.Request != original request; want identical Request") + } } mu.Lock() -- 2.48.1