Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS
Mirrored from https://github.com/Slazee/caddy.git
Synced Nov 14, 04:00 UTC
headers: Canonicalize case in replace (fix #4330)
Matthew Holt committed
Sep 13, 2021 at 10:13 UTC
a437206643f35a84dea280c99e7e9555fc8df697
2 files changed
+35
-7
modules/caddyhttp/headers/headers.go
+12
-6
@@ -213,7 +213,7 @@ func (ops HeaderOps) ApplyTo(hdr http.Header, repl *caddy.Replacer) {
213
214
// replace
215
for fieldName, replacements := range ops.Replace {
216
- fieldName = repl.ReplaceAll(fieldName, "")
216
+ fieldName = http.CanonicalHeaderKey(repl.ReplaceAll(fieldName, ""))
217
218
// all fields...
219
if fieldName == "*" {
@@ -237,11 +237,17 @@ func (ops HeaderOps) ApplyTo(hdr http.Header, repl *caddy.Replacer) {
237
for _, r := range replacements {
238
search := repl.ReplaceAll(r.Search, "")
239
replace := repl.ReplaceAll(r.Replace, "")
240
- for i := range hdr[fieldName] {
241
- if r.re != nil {
242
- hdr[fieldName][i] = r.re.ReplaceAllString(hdr[fieldName][i], replace)
243
- } else {
244
- hdr[fieldName][i] = strings.ReplaceAll(hdr[fieldName][i], search, replace)
240
+ for hdrFieldName, vals := range hdr {
241
+ // see issue #4330 for why we don't simply use hdr[fieldName]
242
+ if http.CanonicalHeaderKey(hdrFieldName) != fieldName {
243
+ continue
244
+ }
245
+ for i := range vals {
246
+ if r.re != nil {
247
+ hdr[hdrFieldName][i] = r.re.ReplaceAllString(hdr[hdrFieldName][i], replace)
248
+ } else {
249
+ hdr[hdrFieldName][i] = strings.ReplaceAll(hdr[hdrFieldName][i], search, replace)
250
+ }
251
}
252
}
253
}
modules/caddyhttp/headers/headers_test.go
+23
-1
@@ -160,6 +160,28 @@ func TestHandler(t *testing.T) {
160
"Fail-5xx": []string{"true"},
161
},
162
},
163
+ {
164
+ handler: Handler{
165
+ Request: &HeaderOps{
166
+ Replace: map[string][]Replacement{
167
+ "Case-Insensitive": {
168
+ Replacement{
169
+ Search: "issue4330",
170
+ Replace: "issue #4330",
171
+ },
172
+ },
173
+ },
174
+ },
175
+ },
176
+ reqHeader: http.Header{
177
+ "case-insensitive": []string{"issue4330"},
178
+ "Other-Header": []string{"issue4330"},
179
+ },
180
+ expectedReqHeader: http.Header{
181
+ "case-insensitive": []string{"issue #4330"},
182
+ "Other-Header": []string{"issue4330"},
183
+ },
184
+ },
185
} {
186
rr := httptest.NewRecorder()
187
@@ -191,7 +213,7 @@ func TestHandler(t *testing.T) {
213
})
214
215
if err := tc.handler.ServeHTTP(rr, req, next); err != nil {
194
- t.Errorf("Test %d: %w", i, err)
216
+ t.Errorf("Test %d: %v", i, err)
217
continue
218
}
219