1
0
Fork 0
eighty/middleware/cache_control.go

35 lines
1.1 KiB
Go

package middleware
import (
"amuz.es/src/go/eighty"
"net/http"
"strconv"
"time"
)
// CacheControlFunc returns a func(next http.Handler) http.Handler that handles cache control header.
func CacheControlFunc(debug bool, startupTime time.Time) func(next http.Handler) http.Handler {
baseVersion := startupTime.Unix()
return func(next http.Handler) http.Handler {
if debug {
return next
} else {
fn := func(w http.ResponseWriter, r *http.Request) {
defer next.ServeHTTP(w, r)
if receivedVersion, err := strconv.ParseInt(r.URL.Query().Get("v"), 10, 64); err == nil && receivedVersion >= baseVersion {
var cacheDuration int64 = 2592000
if pushedDuration, err := strconv.ParseInt(r.URL.Query().Get("d"), 10, 64); err == nil && pushedDuration > cacheDuration {
cacheDuration = pushedDuration
}
//add header
cacheDurationStr := strconv.FormatInt(cacheDuration, 10)
w.Header().Add(eighty.CacheControlHeader, "public, max-age="+cacheDurationStr)
w.Header().Add(eighty.ExpiresHeader, cacheDurationStr)
}
w.Header().Add(eighty.VaryHeader, "User-Agent")
}
return http.HandlerFunc(fn)
}
}
}