Skip to content

Commit b6e1d7a

Browse files
authored
Merge pull request #122 from hashicorp/f-http-getter-headers
HttpGetter: Add ability to set headers
2 parents 4bda8fa + cf40a22 commit b6e1d7a

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)