]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.14] net/http: deep copy Request.TransferEncoding
authordqu123 <davidqu12345@gmail.com>
Sat, 10 Oct 2020 20:25:07 +0000 (16:25 -0400)
committerCarlos Amedee <carlos@golang.org>
Fri, 23 Oct 2020 21:36:46 +0000 (21:36 +0000)
The existing implementation in Request.Clone() assigns the wrong
pointer to r2.TransferEncoding.

Updates #41907.
Fixes #41913.

Change-Id: I7f220a41b1b46a55d1a1005e47c6dd69478cb025
Reviewed-on: https://go-review.googlesource.com/c/go/+/261377
Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Carlos Amedee <carlos@golang.org>
Trust: Emmanuel Odeke <emm.odeke@gmail.com>

src/net/http/request.go
src/net/http/request_test.go

index 88fa0939f246e365b5fc2b65465f6b53d4463f50..cb2edd2ef931e16be649df2a568a825f228a21ba 100644 (file)
@@ -387,7 +387,7 @@ func (r *Request) Clone(ctx context.Context) *Request {
        if s := r.TransferEncoding; s != nil {
                s2 := make([]string, len(s))
                copy(s2, s)
-               r2.TransferEncoding = s
+               r2.TransferEncoding = s2
        }
        r2.Form = cloneURLValues(r.Form)
        r2.PostForm = cloneURLValues(r.PostForm)
index 42c16d00ea8c60cd76c75b994c26fcaffc5a703d..461d66e05d70798a22d2aad0f549df59e6f48980 100644 (file)
@@ -828,6 +828,27 @@ func TestWithContextDeepCopiesURL(t *testing.T) {
        }
 }
 
+// Ensure that Request.Clone creates a deep copy of TransferEncoding.
+// See issue 41907.
+func TestRequestCloneTransferEncoding(t *testing.T) {
+       body := strings.NewReader("body")
+       req, _ := NewRequest("POST", "https://example.org/", body)
+       req.TransferEncoding = []string{
+               "encoding1",
+       }
+
+       clonedReq := req.Clone(context.Background())
+       // modify original after deep copy
+       req.TransferEncoding[0] = "encoding2"
+
+       if req.TransferEncoding[0] != "encoding2" {
+               t.Error("expected req.TransferEncoding to be changed")
+       }
+       if clonedReq.TransferEncoding[0] != "encoding1" {
+               t.Error("expected clonedReq.TransferEncoding to be unchanged")
+       }
+}
+
 func TestNoPanicOnRoundTripWithBasicAuth_h1(t *testing.T) {
        testNoPanicWithBasicAuth(t, h1Mode)
 }