diff options
author | 2023-07-13 21:27:25 +0200 | |
---|---|---|
committer | 2023-07-13 21:27:25 +0200 | |
commit | 12b6cdcd8ce52269be5a1ca8acaae006896808b5 (patch) | |
tree | eba84aa522ba2ccbfb539930789a046630d03dae /internal/middleware/cachecontrol.go | |
parent | [chore] Skip webfinger test on CI (#1983) (diff) | |
download | gotosocial-12b6cdcd8ce52269be5a1ca8acaae006896808b5.tar.xz |
[bugfix] Set Vary header correctly on cache-control (#1988)v0.10.0-rc2
* [bugfix] Set Vary header correctly on cache-control
* Prefer activitypub types on AP endpoints
* use immutable on file server, vary by range
* vary auth on Accept
Diffstat (limited to 'internal/middleware/cachecontrol.go')
-rw-r--r-- | internal/middleware/cachecontrol.go | 51 |
1 files changed, 46 insertions, 5 deletions
diff --git a/internal/middleware/cachecontrol.go b/internal/middleware/cachecontrol.go index 1b471a87c..03b9ca2cb 100644 --- a/internal/middleware/cachecontrol.go +++ b/internal/middleware/cachecontrol.go @@ -23,12 +23,53 @@ import ( "github.com/gin-gonic/gin" ) -// CacheControl returns a new gin middleware which allows callers to control cache settings on response headers. -// -// For directives, see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control -func CacheControl(directives ...string) gin.HandlerFunc { - ccHeader := strings.Join(directives, ", ") +type CacheControlConfig struct { + // Slice of Cache-Control directives, which will be + // joined comma-separated and served as the value of + // the Cache-Control header. + // + // If no directives are set, the Cache-Control header + // will not be sent in the response at all. + // + // For possible Cache-Control directive values, see: + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control + Directives []string + + // Slice of Vary header values, which will be joined + // comma-separated and served as the value of the Vary + // header in the response. + // + // If no Vary header values are supplied, then the + // Vary header will be omitted in the response. + // + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Vary + Vary []string +} + +// CacheControl returns a new gin middleware which allows +// routes to control cache settings on response headers. +func CacheControl(config CacheControlConfig) gin.HandlerFunc { + if len(config.Directives) == 0 { + // No Cache-Control directives provided, + // return empty/stub function. + return func(c *gin.Context) {} + } + + // Cache control is usually done on hot paths so + // parse vars outside of the returned function. + var ( + ccHeader = strings.Join(config.Directives, ", ") + varyHeader = strings.Join(config.Vary, ", ") + ) + + if varyHeader == "" { + return func(c *gin.Context) { + c.Header("Cache-Control", ccHeader) + } + } + return func(c *gin.Context) { c.Header("Cache-Control", ccHeader) + c.Header("Vary", varyHeader) } } |