39 lines
988 B
Go
39 lines
988 B
Go
package middleware
|
|
|
|
import (
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
"vctp/version"
|
|
)
|
|
|
|
// CacheMiddleware sets the Cache-Control header based on the version.
|
|
func CacheMiddleware(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
if version.Value == "dev" {
|
|
w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
|
|
w.Header().Set("Pragma", "no-cache")
|
|
w.Header().Set("Expires", "0")
|
|
} else {
|
|
cacheControl := "public, max-age=31536000"
|
|
if isVersionedAssetRequest(r) {
|
|
cacheControl += ", immutable"
|
|
}
|
|
w.Header().Set("Cache-Control", cacheControl)
|
|
w.Header().Set("Expires", time.Now().UTC().Add(365*24*time.Hour).Format(http.TimeFormat))
|
|
}
|
|
w.Header().Set("Vary", "Accept-Encoding")
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|
|
|
|
func isVersionedAssetRequest(r *http.Request) bool {
|
|
if r == nil {
|
|
return false
|
|
}
|
|
if r.URL.Query().Get("v") != "" {
|
|
return true
|
|
}
|
|
return strings.Contains(r.URL.Path, "@")
|
|
}
|