summaryrefslogtreecommitdiff
path: root/modules/caddyhttp
diff options
context:
space:
mode:
authorMatthew Holt <mholt@users.noreply.github.com>2022-08-08 13:09:57 -0600
committerMatthew Holt <mholt@users.noreply.github.com>2022-08-08 13:09:57 -0600
commit7ab61f46f0db1ee63c6c691def61ca2a9ebee332 (patch)
treec00ccd07c5ecdec284fd0b0ea236a44caea71099 /modules/caddyhttp
parent8c72f343576684f012f97b087a79132583090eff (diff)
fileserver: Better fix for Etag of compressed files
Diffstat (limited to 'modules/caddyhttp')
-rw-r--r--modules/caddyhttp/fileserver/staticfiles.go17
1 files changed, 13 insertions, 4 deletions
diff --git a/modules/caddyhttp/fileserver/staticfiles.go b/modules/caddyhttp/fileserver/staticfiles.go
index 43ef088..a745d5a 100644
--- a/modules/caddyhttp/fileserver/staticfiles.go
+++ b/modules/caddyhttp/fileserver/staticfiles.go
@@ -351,6 +351,7 @@ func (fsrv *FileServer) ServeHTTP(w http.ResponseWriter, r *http.Request, next c
}
var file fs.File
+ var etag string
// check for precompressed files
for _, ae := range encode.AcceptedEncodings(r, fsrv.PrecompressedOrder) {
@@ -371,13 +372,19 @@ func (fsrv *FileServer) ServeHTTP(w http.ResponseWriter, r *http.Request, next c
if caddyErr, ok := err.(caddyhttp.HandlerError); ok && caddyErr.StatusCode == http.StatusServiceUnavailable {
return err
}
+ file = nil
continue
}
defer file.Close()
- info = compressedInfo
w.Header().Set("Content-Encoding", ae)
w.Header().Del("Accept-Ranges")
w.Header().Add("Vary", "Accept-Encoding")
+
+ // don't assign info = compressedInfo because sidecars are kind
+ // of transparent; however we do need to set the Etag:
+ // https://caddy.community/t/gzipped-sidecar-file-wrong-same-etag/16793
+ etag = calculateEtag(compressedInfo)
+
break
}
@@ -395,11 +402,13 @@ func (fsrv *FileServer) ServeHTTP(w http.ResponseWriter, r *http.Request, next c
return err // error is already structured
}
defer file.Close()
+
+ etag = calculateEtag(info)
}
- // set the ETag - note that a conditional If-None-Match request is handled
- // by http.ServeContent below, which checks against this ETag value
- w.Header().Set("Etag", calculateEtag(info))
+ // set the Etag - note that a conditional If-None-Match request is handled
+ // by http.ServeContent below, which checks against this Etag value
+ w.Header().Set("Etag", etag)
if w.Header().Get("Content-Type") == "" {
mtyp := mime.TypeByExtension(filepath.Ext(filename))