diff options
author | Emmanuel T Odeke <emmanuel@orijtech.com> | 2019-10-13 15:07:06 -0700 |
---|---|---|
committer | Emmanuel Odeke <emm.odeke@gmail.com> | 2019-10-14 17:53:36 +0000 |
commit | 9969c720800302c63147720da5507633133bd4a6 (patch) | |
tree | af45c6920f24ee26fc0b5931c020c2de0d706d2b /src/net/http/header_test.go | |
parent | dab199c9c10717bd134edacdfddf084b9295b1b7 (diff) | |
download | go-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.go | 32 |
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") + }) + } +} |