From 1517f2da05187ac06193434a9d03e4dc163d1d0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Senart?= Date: Thu, 31 Oct 2013 00:09:47 +0100 Subject: [PATCH] Copy http.Header for each Target Fixes #30 and likely other nasty problems with the internals of the http.Client mutating the shared Header. Thanks @timjnh for reporting. --- lib/targets.go | 7 ++++++- lib/targets_test.go | 5 +++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/targets.go b/lib/targets.go index 55fec30..9b9739a 100644 --- a/lib/targets.go +++ b/lib/targets.go @@ -58,8 +58,13 @@ func (t Targets) Shuffle(seed int64) { } // SetHeader sets the passed request header in all Targets +// by making a copy for each func (t Targets) SetHeader(header http.Header) { for _, target := range t { - target.Header = header + target.Header = make(http.Header, len(header)) + for k, vs := range header { + target.Header[k] = make([]string, len(vs)) + copy(target.Header[k], vs) + } } } diff --git a/lib/targets_test.go b/lib/targets_test.go index 9212ea3..35c2704 100644 --- a/lib/targets_test.go +++ b/lib/targets_test.go @@ -62,4 +62,9 @@ func TestSetHeader(t *testing.T) { t.Errorf("Want: %s, Got: %s", want, got) } } + // Test Header copy + targets[0].Header.Set("Authorization", "0") + if targets[1].Header.Get("Authorization") == "0" { + t.Error("Each Target must have it's own Header") + } }