Skip to content

Commit cf40a22

Browse files
committed
HttpGetter: Add ability to set headers
This adds the ability to set headers that will be sent out on every request of a particular HttpGetter. This is useful in situations where query parameters are not suitable, such as when headers are explicitly expected, or when one wants to move information off the query string that would be at risk of possibly being exposed in logs or error messages. Fixes #71.
1 parent 4bda8fa commit cf40a22

File tree

2 files changed

+62
-2
lines changed

2 files changed

+62
-2
lines changed

get_http.go

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ type HttpGetter struct {
4141
// Client is the http.Client to use for Get requests.
4242
// This defaults to a cleanhttp.DefaultClient if left unset.
4343
Client *http.Client
44+
45+
// Header contains optional request header fields that should be included
46+
// with every HTTP request. Note that the zero value of this field is nil,
47+
// and as such it needs to be initialized before use, via something like
48+
// make(http.Header).
49+
Header http.Header
4450
}
4551

4652
func (g *HttpGetter) ClientMode(u *url.URL) (ClientMode, error) {
@@ -72,10 +78,17 @@ func (g *HttpGetter) Get(dst string, u *url.URL) error {
7278
u.RawQuery = q.Encode()
7379

7480
// Get the URL
75-
resp, err := g.Client.Get(u.String())
81+
req, err := http.NewRequest("GET", u.String(), nil)
82+
if err != nil {
83+
return err
84+
}
85+
86+
req.Header = g.Header
87+
resp, err := g.Client.Do(req)
7688
if err != nil {
7789
return err
7890
}
91+
7992
defer resp.Body.Close()
8093
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
8194
return fmt.Errorf("bad response code: %d", resp.StatusCode)
@@ -118,10 +131,17 @@ func (g *HttpGetter) GetFile(dst string, u *url.URL) error {
118131
g.Client = httpClient
119132
}
120133

121-
resp, err := g.Client.Get(u.String())
134+
req, err := http.NewRequest("GET", u.String(), nil)
122135
if err != nil {
123136
return err
124137
}
138+
139+
req.Header = g.Header
140+
resp, err := g.Client.Do(req)
141+
if err != nil {
142+
return err
143+
}
144+
125145
defer resp.Body.Close()
126146
if resp.StatusCode != 200 {
127147
return fmt.Errorf("bad response code: %d", resp.StatusCode)

get_http_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,34 @@ func TestHttpGetter_header(t *testing.T) {
4040
}
4141
}
4242

43+
func TestHttpGetter_requestHeader(t *testing.T) {
44+
ln := testHttpServer(t)
45+
defer ln.Close()
46+
47+
g := new(HttpGetter)
48+
g.Header = make(http.Header)
49+
g.Header.Add("X-Foobar", "foobar")
50+
dst := tempDir(t)
51+
defer os.RemoveAll(dst)
52+
53+
var u url.URL
54+
u.Scheme = "http"
55+
u.Host = ln.Addr().String()
56+
u.Path = "/expect-header"
57+
u.RawQuery = "expected=X-Foobar"
58+
59+
// Get it!
60+
if err := g.GetFile(dst, &u); err != nil {
61+
t.Fatalf("err: %s", err)
62+
}
63+
64+
// Verify the main file exists
65+
if _, err := os.Stat(dst); err != nil {
66+
t.Fatalf("err: %s", err)
67+
}
68+
assertContents(t, dst, "Hello\n")
69+
}
70+
4371
func TestHttpGetter_meta(t *testing.T) {
4472
ln := testHttpServer(t)
4573
defer ln.Close()
@@ -255,6 +283,7 @@ func testHttpServer(t *testing.T) net.Listener {
255283
}
256284

257285
mux := http.NewServeMux()
286+
mux.HandleFunc("/expect-header", testHttpHandlerExpectHeader)
258287
mux.HandleFunc("/file", testHttpHandlerFile)
259288
mux.HandleFunc("/header", testHttpHandlerHeader)
260289
mux.HandleFunc("/meta", testHttpHandlerMeta)
@@ -269,6 +298,17 @@ func testHttpServer(t *testing.T) net.Listener {
269298
return ln
270299
}
271300

301+
func testHttpHandlerExpectHeader(w http.ResponseWriter, r *http.Request) {
302+
if expected, ok := r.URL.Query()["expected"]; ok {
303+
if r.Header.Get(expected[0]) != "" {
304+
w.Write([]byte("Hello\n"))
305+
return
306+
}
307+
}
308+
309+
w.WriteHeader(400)
310+
}
311+
272312
func testHttpHandlerFile(w http.ResponseWriter, r *http.Request) {
273313
w.Write([]byte("Hello\n"))
274314
}

0 commit comments

Comments
 (0)