Commit a2900e46 authored by Tw's avatar Tw Committed by Matt Holt

header: only register deletion operation (#1212)

fix issue #1183
Signed-off-by: default avatarTw <tw19881113@gmail.com>
parent 08c17c7c
...@@ -32,9 +32,9 @@ func (h Headers) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) ...@@ -32,9 +32,9 @@ func (h Headers) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error)
if strings.HasPrefix(header.Name, "-") { if strings.HasPrefix(header.Name, "-") {
rww.delHeader(strings.TrimLeft(header.Name, "-")) rww.delHeader(strings.TrimLeft(header.Name, "-"))
} else if strings.HasPrefix(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 { } else {
rww.setHeader(header.Name, replacer.Replace(header.Value)) rww.Header().Set(header.Name, replacer.Replace(header.Value))
} }
} }
} }
...@@ -95,24 +95,15 @@ func (rww *responseWriterWrapper) WriteHeader(status int) { ...@@ -95,24 +95,15 @@ func (rww *responseWriterWrapper) WriteHeader(status int) {
rww.w.WriteHeader(status) rww.w.WriteHeader(status)
} }
// addHeader registers a http.Header.Add operation // delHeader deletes the existing header according to the key
func (rww *responseWriterWrapper) addHeader(key, value string) { // Also it will delete that header added later.
rww.ops = append(rww.ops, func(h http.Header) {
h.Add(key, value)
})
}
// delHeader registers a http.Header.Del operation
func (rww *responseWriterWrapper) delHeader(key string) { func (rww *responseWriterWrapper) delHeader(key string) {
rww.ops = append(rww.ops, func(h http.Header) { // remove the existing one if any
h.Del(key) rww.Header().Del(key)
})
}
// setHeader registers a http.Header.Set operation // register a future deletion
func (rww *responseWriterWrapper) setHeader(key, value string) {
rww.ops = append(rww.ops, func(h http.Header) { rww.ops = append(rww.ops, func(h http.Header) {
h.Set(key, value) h.Del(key)
}) })
} }
......
...@@ -25,6 +25,7 @@ func TestHeader(t *testing.T) { ...@@ -25,6 +25,7 @@ func TestHeader(t *testing.T) {
{"/a", "Foo", "Bar"}, {"/a", "Foo", "Bar"},
{"/a", "Bar", ""}, {"/a", "Bar", ""},
{"/a", "Baz", ""}, {"/a", "Baz", ""},
{"/a", "Server", ""},
{"/a", "ServerName", hostname}, {"/a", "ServerName", hostname},
{"/b", "Foo", ""}, {"/b", "Foo", ""},
{"/b", "Bar", "Removed in /a"}, {"/b", "Bar", "Removed in /a"},
...@@ -32,7 +33,7 @@ func TestHeader(t *testing.T) { ...@@ -32,7 +33,7 @@ func TestHeader(t *testing.T) {
he := Headers{ he := Headers{
Next: httpserver.HandlerFunc(func(w http.ResponseWriter, r *http.Request) (int, error) { Next: httpserver.HandlerFunc(func(w http.ResponseWriter, r *http.Request) (int, error) {
w.Header().Set("Bar", "Removed in /a") w.Header().Set("Bar", "Removed in /a")
fmt.Fprint(w, "This is a test") w.WriteHeader(http.StatusOK)
return 0, nil return 0, nil
}), }),
Rules: []Rule{ Rules: []Rule{
...@@ -40,6 +41,7 @@ func TestHeader(t *testing.T) { ...@@ -40,6 +41,7 @@ func TestHeader(t *testing.T) {
{Name: "Foo", Value: "Bar"}, {Name: "Foo", Value: "Bar"},
{Name: "ServerName", Value: "{hostname}"}, {Name: "ServerName", Value: "{hostname}"},
{Name: "-Bar"}, {Name: "-Bar"},
{Name: "-Server"},
}}, }},
}, },
} }
...@@ -50,6 +52,8 @@ func TestHeader(t *testing.T) { ...@@ -50,6 +52,8 @@ func TestHeader(t *testing.T) {
} }
rec := httptest.NewRecorder() rec := httptest.NewRecorder()
// preset header
rec.Header().Set("Server", "Caddy")
he.ServeHTTP(rec, req) he.ServeHTTP(rec, req)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment