mirror of
https://github.com/caddyserver/caddy.git
synced 2024-12-27 22:23:48 +03:00
headers: Canonicalize case in replace (fix #4330)
This commit is contained in:
parent
a779e1b383
commit
a437206643
2 changed files with 35 additions and 7 deletions
|
@ -213,7 +213,7 @@ func (ops HeaderOps) ApplyTo(hdr http.Header, repl *caddy.Replacer) {
|
||||||
|
|
||||||
// replace
|
// replace
|
||||||
for fieldName, replacements := range ops.Replace {
|
for fieldName, replacements := range ops.Replace {
|
||||||
fieldName = repl.ReplaceAll(fieldName, "")
|
fieldName = http.CanonicalHeaderKey(repl.ReplaceAll(fieldName, ""))
|
||||||
|
|
||||||
// all fields...
|
// all fields...
|
||||||
if fieldName == "*" {
|
if fieldName == "*" {
|
||||||
|
@ -237,11 +237,17 @@ func (ops HeaderOps) ApplyTo(hdr http.Header, repl *caddy.Replacer) {
|
||||||
for _, r := range replacements {
|
for _, r := range replacements {
|
||||||
search := repl.ReplaceAll(r.Search, "")
|
search := repl.ReplaceAll(r.Search, "")
|
||||||
replace := repl.ReplaceAll(r.Replace, "")
|
replace := repl.ReplaceAll(r.Replace, "")
|
||||||
for i := range hdr[fieldName] {
|
for hdrFieldName, vals := range hdr {
|
||||||
if r.re != nil {
|
// see issue #4330 for why we don't simply use hdr[fieldName]
|
||||||
hdr[fieldName][i] = r.re.ReplaceAllString(hdr[fieldName][i], replace)
|
if http.CanonicalHeaderKey(hdrFieldName) != fieldName {
|
||||||
} else {
|
continue
|
||||||
hdr[fieldName][i] = strings.ReplaceAll(hdr[fieldName][i], search, replace)
|
}
|
||||||
|
for i := range vals {
|
||||||
|
if r.re != nil {
|
||||||
|
hdr[hdrFieldName][i] = r.re.ReplaceAllString(hdr[hdrFieldName][i], replace)
|
||||||
|
} else {
|
||||||
|
hdr[hdrFieldName][i] = strings.ReplaceAll(hdr[hdrFieldName][i], search, replace)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -160,6 +160,28 @@ func TestHandler(t *testing.T) {
|
||||||
"Fail-5xx": []string{"true"},
|
"Fail-5xx": []string{"true"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
handler: Handler{
|
||||||
|
Request: &HeaderOps{
|
||||||
|
Replace: map[string][]Replacement{
|
||||||
|
"Case-Insensitive": {
|
||||||
|
Replacement{
|
||||||
|
Search: "issue4330",
|
||||||
|
Replace: "issue #4330",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
reqHeader: http.Header{
|
||||||
|
"case-insensitive": []string{"issue4330"},
|
||||||
|
"Other-Header": []string{"issue4330"},
|
||||||
|
},
|
||||||
|
expectedReqHeader: http.Header{
|
||||||
|
"case-insensitive": []string{"issue #4330"},
|
||||||
|
"Other-Header": []string{"issue4330"},
|
||||||
|
},
|
||||||
|
},
|
||||||
} {
|
} {
|
||||||
rr := httptest.NewRecorder()
|
rr := httptest.NewRecorder()
|
||||||
|
|
||||||
|
@ -191,7 +213,7 @@ func TestHandler(t *testing.T) {
|
||||||
})
|
})
|
||||||
|
|
||||||
if err := tc.handler.ServeHTTP(rr, req, next); err != nil {
|
if err := tc.handler.ServeHTTP(rr, req, next); err != nil {
|
||||||
t.Errorf("Test %d: %w", i, err)
|
t.Errorf("Test %d: %v", i, err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue