diff options
author | Damien Neil <dneil@google.com> | 2020-06-11 13:30:23 -0700 |
---|---|---|
committer | Dmitri Shuralyov <dmitshur@golang.org> | 2020-08-27 20:20:16 +0000 |
commit | fae8e09d26f3bb065475abd44b47f54e25179cdc (patch) | |
tree | 5bab975fc71a54c66b9dcacfaf69b55005011095 | |
parent | 0d8ee358ec82f1660e1ee02d6de67270751a287a (diff) | |
download | go-fae8e09d26f3bb065475abd44b47f54e25179cdc.tar.gz go-fae8e09d26f3bb065475abd44b47f54e25179cdc.zip |
[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 <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
Reviewed-on: https://go-review.googlesource.com/c/go/+/249880
Run-TryBot: Dmitri Shuralyov <dmitshur@golang.org>
Reviewed-by: Damien Neil <dneil@google.com>
-rw-r--r-- | src/net/http/transport.go | 2 | ||||
-rw-r--r-- | src/net/http/transport_test.go | 6 |
2 files changed, 7 insertions, 1 deletions
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() |