@marcel91200 / caddy Mirror · read-only / commits / a4372066
Fork 0

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