aboutsummaryrefslogtreecommitdiff
path: root/src/net/http/header_test.go
diff options
context:
space:
mode:
authorEmmanuel T Odeke <emmanuel@orijtech.com>2019-10-13 15:07:06 -0700
committerEmmanuel Odeke <emm.odeke@gmail.com>2019-10-14 17:53:36 +0000
commit9969c720800302c63147720da5507633133bd4a6 (patch)
treeaf45c6920f24ee26fc0b5931c020c2de0d706d2b /src/net/http/header_test.go
parentdab199c9c10717bd134edacdfddf084b9295b1b7 (diff)
downloadgo-9969c720800302c63147720da5507633133bd4a6.tar.gz
go-9969c720800302c63147720da5507633133bd4a6.zip
net/http: fix Transport panic with nil Request.Header
For Go 1.13 we introduced Header.Clone and it returns nil if a nil Header is cloned. Unfortunately, though, this exported Header.Clone nil behavior differed from the old Go 1.12 and earlier internal header clone behavior which always returned non-nil Headers. This CL fixes the places where that distinction mattered. Fixes #34878 Change-Id: Id19dea2272948c8dd10883b18ea7f7b8b33ea8eb Reviewed-on: https://go-review.googlesource.com/c/go/+/200977 Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/net/http/header_test.go')
-rw-r--r--src/net/http/header_test.go32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/net/http/header_test.go b/src/net/http/header_test.go
index 51fcab103b..4789362919 100644
--- a/src/net/http/header_test.go
+++ b/src/net/http/header_test.go
@@ -7,6 +7,7 @@ package http
import (
"bytes"
"internal/race"
+ "reflect"
"runtime"
"testing"
"time"
@@ -219,3 +220,34 @@ func TestHeaderWriteSubsetAllocs(t *testing.T) {
t.Errorf("allocs = %g; want 0", n)
}
}
+
+// Issue 34878: test that every call to
+// cloneOrMakeHeader never returns a nil Header.
+func TestCloneOrMakeHeader(t *testing.T) {
+ tests := []struct {
+ name string
+ in, want Header
+ }{
+ {"nil", nil, Header{}},
+ {"empty", Header{}, Header{}},
+ {
+ name: "non-empty",
+ in: Header{"foo": {"bar"}},
+ want: Header{"foo": {"bar"}},
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ got := cloneOrMakeHeader(tt.in)
+ if got == nil {
+ t.Fatal("unexpected nil Header")
+ }
+ if !reflect.DeepEqual(got, tt.want) {
+ t.Fatalf("Got: %#v\nWant: %#v", got, tt.want)
+ }
+ got.Add("A", "B")
+ got.Get("A")
+ })
+ }
+}