Commit 8045405

Eric Bower  ·  2026-04-20 22:21:20 -0400 EDT
parent 4acf8cc
chore: normalize header keys
2 files changed,  +10, -2
+8, -1
......@@ -2,6 +2,7 @@ package httpcache
22
33 import (
44 "net/http"
5+ "strings"
56 "time"
67 )
78
......@@ -43,8 +44,14 @@ func (rw *responseWriter) Send() {
4344 }
4445
4546 func (rw *responseWriter) ToCacheValue() *CacheValue {
47+ // Normalize header keys to lowercase to avoid case-sensitivity issues
48+ // in the cached map (e.g., "ETag" vs "Etag" as separate keys).
49+ headers := make(map[string][]string)
50+ for k, v := range rw.Header() {
51+ headers[strings.ToLower(k)] = v
52+ }
4653 cv := &CacheValue{
47- Header: rw.Header(),
54+ Header: headers,
4855 Body: rw.body,
4956 CreatedAt: time.Now(),
5057 StatusCode: rw.StatusCode(),
+2, -1
......@@ -140,11 +140,12 @@ func (c *HttpCache) ServeHTTP(w http.ResponseWriter, r *http.Request) {
140140 }
141141
142142 // Merge non-forbidden headers from the 304 response into the cached entry.
143+ // Normalize keys to lowercase to avoid case-sensitivity issues.
143144 for key, values := range wrapped.Header() {
144145 if isForbiddenHeader(key) {
145146 continue
146147 }
147- cacheValue.Header[key] = values
148+ cacheValue.Header[strings.ToLower(key)] = values
148149 }
149150 // Revalidation refreshes the entry -- reset CreatedAt so it's fresh again.
150151 cacheValue.CreatedAt = time.Now()