Skip to content

Commit

Permalink
header: only register deletion operation (caddyserver#1212)
Browse files Browse the repository at this point in the history
fix issue caddyserver#1183

Signed-off-by: Tw <[email protected]>
  • Loading branch information
tw4452852 authored and mholt committed Nov 2, 2016
1 parent 08c17c7 commit a2900e4
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 18 deletions.
25 changes: 8 additions & 17 deletions caddyhttp/header/header.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ func (h Headers) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error)
if strings.HasPrefix(header.Name, "-") {
rww.delHeader(strings.TrimLeft(header.Name, "-"))
} else if strings.HasPrefix(header.Name, "+") {
rww.addHeader(strings.TrimLeft(header.Name, "+"), replacer.Replace(header.Value))
rww.Header().Add(strings.TrimLeft(header.Name, "+"), replacer.Replace(header.Value))
} else {
rww.setHeader(header.Name, replacer.Replace(header.Value))
rww.Header().Set(header.Name, replacer.Replace(header.Value))
}
}
}
Expand Down Expand Up @@ -95,24 +95,15 @@ func (rww *responseWriterWrapper) WriteHeader(status int) {
rww.w.WriteHeader(status)
}

// addHeader registers a http.Header.Add operation
func (rww *responseWriterWrapper) addHeader(key, value string) {
rww.ops = append(rww.ops, func(h http.Header) {
h.Add(key, value)
})
}

// delHeader registers a http.Header.Del operation
// delHeader deletes the existing header according to the key
// Also it will delete that header added later.
func (rww *responseWriterWrapper) delHeader(key string) {
rww.ops = append(rww.ops, func(h http.Header) {
h.Del(key)
})
}
// remove the existing one if any
rww.Header().Del(key)

// setHeader registers a http.Header.Set operation
func (rww *responseWriterWrapper) setHeader(key, value string) {
// register a future deletion
rww.ops = append(rww.ops, func(h http.Header) {
h.Set(key, value)
h.Del(key)
})
}

Expand Down
6 changes: 5 additions & 1 deletion caddyhttp/header/header_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,21 +25,23 @@ func TestHeader(t *testing.T) {
{"/a", "Foo", "Bar"},
{"/a", "Bar", ""},
{"/a", "Baz", ""},
{"/a", "Server", ""},
{"/a", "ServerName", hostname},
{"/b", "Foo", ""},
{"/b", "Bar", "Removed in /a"},
} {
he := Headers{
Next: httpserver.HandlerFunc(func(w http.ResponseWriter, r *http.Request) (int, error) {
w.Header().Set("Bar", "Removed in /a")
fmt.Fprint(w, "This is a test")
w.WriteHeader(http.StatusOK)
return 0, nil
}),
Rules: []Rule{
{Path: "/a", Headers: []Header{
{Name: "Foo", Value: "Bar"},
{Name: "ServerName", Value: "{hostname}"},
{Name: "-Bar"},
{Name: "-Server"},
}},
},
}
Expand All @@ -50,6 +52,8 @@ func TestHeader(t *testing.T) {
}

rec := httptest.NewRecorder()
// preset header
rec.Header().Set("Server", "Caddy")

he.ServeHTTP(rec, req)

Expand Down

0 comments on commit a2900e4

Please sign in to comment.