From: Damien Neil Date: Thu, 11 Jun 2020 20:30:23 +0000 (-0700) Subject: net/http: make Transport.RoundTrip preserve Requests X-Git-Tag: go1.15rc1~90 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=8b98498a5833111402a2fe8f13a6605e071994b6;p=gostls13.git 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. Fixes #39533 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 --- diff --git a/src/net/http/transport.go b/src/net/http/transport.go index da86b26106..a41e732d98 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 99056a42d9..31a41f5351 100644 --- a/src/net/http/transport_test.go +++ b/src/net/http/transport_test.go @@ -3511,7 +3511,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() @@ -3522,6 +3523,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()