From: dqu123 Date: Sat, 10 Oct 2020 20:25:07 +0000 (-0400) Subject: net/http: deep copy Request.TransferEncoding X-Git-Tag: go1.16beta1~789 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=0f53453b32054b681dac6e8b025c85a785396102;p=gostls13.git net/http: deep copy Request.TransferEncoding The existing implementation in Request.Clone() assigns the wrong pointer to r2.TransferEncoding. Fixes #41907 Change-Id: I7f220a41b1b46a55d1a1005e47c6dd69478cb025 Reviewed-on: https://go-review.googlesource.com/c/go/+/261258 Reviewed-by: Brad Fitzpatrick Reviewed-by: Emmanuel Odeke Trust: Emmanuel Odeke --- diff --git a/src/net/http/request.go b/src/net/http/request.go index fe6b60982c..54ec1c5593 100644 --- a/src/net/http/request.go +++ b/src/net/http/request.go @@ -382,7 +382,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) }