mirror of
https://github.com/rjNemo/rentease.git
synced 2026-06-06 02:36:49 +00:00
47 lines
1 KiB
Go
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)
|
|
})
|
|
}
|
|
}
|