diff options
author | dqu123 <davidqu12345@gmail.com> | 2020-10-10 16:25:07 -0400 |
---|---|---|
committer | Carlos Amedee <carlos@golang.org> | 2020-10-23 21:36:46 +0000 |
commit | 3109de2a0d0968eda8321d943a68ba90eec5779b (patch) | |
tree | 566851c3954fdb199565714ecd96b244922a5b52 | |
parent | 7bc838165d362d27bb2481c37680bb32e986b2d9 (diff) | |
download | go-3109de2a0d0968eda8321d943a68ba90eec5779b.tar.gz go-3109de2a0d0968eda8321d943a68ba90eec5779b.zip |
[release-branch.go1.14] net/http: deep copy Request.TransferEncoding
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>
-rw-r--r-- | src/net/http/request.go | 2 | ||||
-rw-r--r-- | src/net/http/request_test.go | 21 |
2 files changed, 22 insertions, 1 deletions
diff --git a/src/net/http/request.go b/src/net/http/request.go index 88fa0939f2..cb2edd2ef9 100644 --- a/src/net/http/request.go +++ b/src/net/http/request.go @@ -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) diff --git a/src/net/http/request_test.go b/src/net/http/request_test.go index 42c16d00ea..461d66e05d 100644 --- a/src/net/http/request_test.go +++ b/src/net/http/request_test.go @@ -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) } |