summaryrefslogtreecommitdiff
path: root/internal/middleware/cachecontrol.go
diff options
context:
space:
mode:
authorLibravatar tobi <31960611+tsmethurst@users.noreply.github.com>2023-07-13 21:27:25 +0200
committerLibravatar GitHub <noreply@github.com>2023-07-13 21:27:25 +0200
commit12b6cdcd8ce52269be5a1ca8acaae006896808b5 (patch)
treeeba84aa522ba2ccbfb539930789a046630d03dae /internal/middleware/cachecontrol.go
parent[chore] Skip webfinger test on CI (#1983) (diff)
downloadgotosocial-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.go51
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)
}
}