Skip to content

Commit

Permalink
Merge pull request #699 from hashicorp/f-api-response-headers
Browse files Browse the repository at this point in the history
Allow users to configure arbitrary headers in config
  • Loading branch information
diptanu committed Jan 22, 2016
2 parents f0c4960 + 1e56891 commit f1343cd
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ IMPROVEMENTS:
* drivers: Interpret Nomad variables in environment variables/args [GH-653]
* core: Populate job status [GH-663]
* core/cli: Print short identifiers and UX cleanup [GH-675, GH-693, GH-692]
* core/api: Allow users to set arbitrary headers via agent config [GH-699]

BUG FIXES:
* cli: Handle parsing of un-named ports [GH-604]
Expand Down
4 changes: 4 additions & 0 deletions command/agent/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,10 @@ type Config struct {

// List of config files that have been loaded (in order)
Files []string

// HTTPAPIResponseHeaders allows users to configure the Nomad http agent to
// set arbritrary headers on API responses
HTTPAPIResponseHeaders map[string]string `hcl:"http_api_response_headers"`
}

// AtlasConfig is used to enable an parameterize the Atlas integration
Expand Down
6 changes: 6 additions & 0 deletions command/agent/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -453,6 +453,9 @@ func TestConfig_LoadConfigString(t *testing.T) {
Join: true,
Endpoint: "127.0.0.1:1234",
},
HTTPAPIResponseHeaders: map[string]string{
"Access-Control-Allow-Origin": "*",
},
}

// Check parsing
Expand Down Expand Up @@ -531,4 +534,7 @@ atlas {
join = true
endpoint = "127.0.0.1:1234"
}
http_api_response_headers {
Access-Control-Allow-Origin = "*"
}
`
8 changes: 8 additions & 0 deletions command/agent/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ func (e *codedError) Code() int {
// wrap is used to wrap functions to make them more convenient
func (s *HTTPServer) wrap(handler func(resp http.ResponseWriter, req *http.Request) (interface{}, error)) func(resp http.ResponseWriter, req *http.Request) {
f := func(resp http.ResponseWriter, req *http.Request) {
setHeaders(resp, s.agent.config.HTTPAPIResponseHeaders)
// Invoke the handler
reqURL := req.URL.String()
start := time.Now()
Expand Down Expand Up @@ -229,6 +230,13 @@ func setMeta(resp http.ResponseWriter, m *structs.QueryMeta) {
setKnownLeader(resp, m.KnownLeader)
}

// setHeaders is used to set canonical response header fields
func setHeaders(resp http.ResponseWriter, headers map[string]string) {
for field, value := range headers {
resp.Header().Set(http.CanonicalHeaderKey(field), value)
}
}

// parseWait is used to parse the ?wait and ?index query params
// Returns true on error
func parseWait(resp http.ResponseWriter, req *http.Request, b *structs.QueryOptions) bool {
Expand Down
20 changes: 20 additions & 0 deletions command/agent/http_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,26 @@ func TestSetMeta(t *testing.T) {
}
}

func TestSetHeaders(t *testing.T) {
s := makeHTTPServer(t, nil)
s.Agent.config.HTTPAPIResponseHeaders = map[string]string{"foo": "bar"}
defer s.Cleanup()

resp := httptest.NewRecorder()
handler := func(resp http.ResponseWriter, req *http.Request) (interface{}, error) {
return &structs.Job{Name: "foo"}, nil
}

req, _ := http.NewRequest("GET", "/v1/kv/key", nil)
s.Server.wrap(handler)(resp, req)
header := resp.Header().Get("foo")

if header != "bar" {
t.Fatalf("expected header: %v, actual: %v", "bar", header)
}

}

func TestContentTypeIsJSON(t *testing.T) {
s := makeHTTPServer(t, nil)
defer s.Cleanup()
Expand Down
9 changes: 9 additions & 0 deletions website/source/docs/agent/config.html.md
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,15 @@ nodes, unless otherwise specified:
* `disable_anonymous_signature`: Disables providing an anonymous signature
for de-duplication with the update check. See `disable_update_check`.

* `http_api_response_headers`: This object allows adding headers to the
HTTP API responses. For example, the following config can be used to enable
CORS on the HTTP API endpoints:
```
http_api_response_headers {
Access-Control-Allow-Origin = "*"
}
```

## Server-specific Options

The following options are applicable to server agents only and need not be
Expand Down

0 comments on commit f1343cd

Please sign in to comment.