]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.14] net/http: make Transport.RoundTrip preserve Requests
authorDamien Neil <dneil@google.com>
Thu, 11 Jun 2020 20:30:23 +0000 (13:30 -0700)
committerDmitri Shuralyov <dmitshur@golang.org>
Thu, 27 Aug 2020 20:20:16 +0000 (20:20 +0000)
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>
src/net/http/transport.go
src/net/http/transport_test.go

index 0f9001062ae492ab0a93eeba84034bbc79abaf20..5a77e913688a586f87185046eb2141c8c492a208 100644 (file)
@@ -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
                }
 
index 2c8ae9c7ac3c2e5c24e4832621b017d4a8beae41..ba12e834c58b5a4e192183ae810ea07c1c2f77b6 100644 (file)
@@ -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()