rentease/internal/server/middleware.go
2025-11-02 21:45:37 +01:00

47 lines
1 KiB
Go

package server
import (
"fmt"
"net/http"
"strings"
"github.com/rjNemo/underscore"
)
const (
defaultTTL = 2592000 // 1 month
)
// CachingMiddleware adds caching headers.
//
// ttl is the max age of the cache in seconds. If ttl is 0, the default value will be used.
func CachingMiddleware(ttl int, fileTypes ...string) func(http.Handler) http.Handler {
if ttl == 0 {
ttl = defaultTTL
}
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
shouldCache := underscore.Any(fileTypes, func(v string) bool {
return strings.HasSuffix(r.URL.Path, fmt.Sprintf(".%s", v))
})
if shouldCache {
segments := strings.Split(r.URL.Path, "/")
etag := segments[len(segments)-1]
w.Header().Set("Etag", etag)
w.Header().Set("Cache-Control", fmt.Sprintf("max-age=%d", ttl))
if match := r.Header.Get("If-None-Match"); match != "" {
if strings.Contains(match, etag) {
w.WriteHeader(http.StatusNotModified)
return
}
}
}
next.ServeHTTP(w, r)
})
}
}