fileserver: Set "Vary: Accept-Encoding" header (see #5849)

This commit is contained in:
Matthew Holt 2024-04-26 19:38:45 -06:00
parent ba5811467a
commit cabb5d71c4
No known key found for this signature in database
GPG key ID: 2A349DD577D586A5

View file

@ -371,15 +371,17 @@ func (fsrv *FileServer) ServeHTTP(w http.ResponseWriter, r *http.Request, next c
} }
var file fs.File var file fs.File
respHeader := w.Header()
// etag is usually unset, but if the user knows what they're doing, let them override it // etag is usually unset, but if the user knows what they're doing, let them override it
etag := w.Header().Get("Etag") etag := respHeader.Get("Etag")
// static file responses are often compressed, either on-the-fly // static file responses are often compressed, either on-the-fly
// or with precompressed sidecar files; in any case, the headers // or with precompressed sidecar files; in any case, the headers
// should contain "Vary: Accept-Encoding" even when not compressed // should contain "Vary: Accept-Encoding" even when not compressed
// so caches can craft a reliable key (according to REDbot results) // so caches can craft a reliable key (according to REDbot results)
w.Header().Add("Vary", "Accept-Encoding") // see #5849
respHeader.Add("Vary", "Accept-Encoding")
// check for precompressed files // check for precompressed files
for _, ae := range encode.AcceptedEncodings(r, fsrv.PrecompressedOrder) { for _, ae := range encode.AcceptedEncodings(r, fsrv.PrecompressedOrder) {
@ -404,8 +406,8 @@ func (fsrv *FileServer) ServeHTTP(w http.ResponseWriter, r *http.Request, next c
continue continue
} }
defer file.Close() defer file.Close()
w.Header().Set("Content-Encoding", ae) respHeader.Set("Content-Encoding", ae)
w.Header().Del("Accept-Ranges") respHeader.Del("Accept-Ranges")
// try to get the etag from pre computed files if an etag suffix list was provided // try to get the etag from pre computed files if an etag suffix list was provided
if etag == "" && fsrv.EtagFileExtensions != nil { if etag == "" && fsrv.EtagFileExtensions != nil {
@ -459,7 +461,7 @@ func (fsrv *FileServer) ServeHTTP(w http.ResponseWriter, r *http.Request, next c
// to repeat the error; just continue because we're probably // to repeat the error; just continue because we're probably
// trying to write an error page response (see issue #5703) // trying to write an error page response (see issue #5703)
if _, ok := r.Context().Value(caddyhttp.ErrorCtxKey).(error); !ok { if _, ok := r.Context().Value(caddyhttp.ErrorCtxKey).(error); !ok {
w.Header().Add("Allow", "GET, HEAD") respHeader.Add("Allow", "GET, HEAD")
return caddyhttp.Error(http.StatusMethodNotAllowed, nil) return caddyhttp.Error(http.StatusMethodNotAllowed, nil)
} }
} }
@ -467,16 +469,16 @@ func (fsrv *FileServer) ServeHTTP(w http.ResponseWriter, r *http.Request, next c
// set the Etag - note that a conditional If-None-Match request is handled // set the Etag - note that a conditional If-None-Match request is handled
// by http.ServeContent below, which checks against this Etag value // by http.ServeContent below, which checks against this Etag value
if etag != "" { if etag != "" {
w.Header().Set("Etag", etag) respHeader.Set("Etag", etag)
} }
if w.Header().Get("Content-Type") == "" { if respHeader.Get("Content-Type") == "" {
mtyp := mime.TypeByExtension(filepath.Ext(filename)) mtyp := mime.TypeByExtension(filepath.Ext(filename))
if mtyp == "" { if mtyp == "" {
// do not allow Go to sniff the content-type; see https://www.youtube.com/watch?v=8t8JYpt0egE // do not allow Go to sniff the content-type; see https://www.youtube.com/watch?v=8t8JYpt0egE
w.Header()["Content-Type"] = nil respHeader["Content-Type"] = nil
} else { } else {
w.Header().Set("Content-Type", mtyp) respHeader.Set("Content-Type", mtyp)
} }
} }