From 8a6531f50ec86f34ad17cc2e2099acc00fc81025 Mon Sep 17 00:00:00 2001 From: Ruidy Date: Mon, 19 Aug 2024 15:00:38 +0200 Subject: [PATCH] add static assets caching --- internal/server/middleware.go | 44 +++++++++++++++++++++++++++++++++++ internal/server/server.go | 1 + 2 files changed, 45 insertions(+) create mode 100644 internal/server/middleware.go diff --git a/internal/server/middleware.go b/internal/server/middleware.go new file mode 100644 index 0000000..66ee0a2 --- /dev/null +++ b/internal/server/middleware.go @@ -0,0 +1,44 @@ +package server + +import ( + "fmt" + "net/http" + "strings" + + "github.com/labstack/echo/v4" + "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 wil be used. +func CachingMiddleware(ttl int, fileTypes ...string) echo.MiddlewareFunc { + if ttl == 0 { + ttl = defaultTTL + } + return func(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) error { + shouldCache := underscore.Any(fileTypes, func(v string) bool { + return strings.HasSuffix(c.Request().RequestURI, fmt.Sprintf(".%s", v)) + }) + + if shouldCache { + s := strings.Split(c.Request().RequestURI, "/") + etag := s[len(s)-1] + + c.Response().Header().Set("Etag", etag) + c.Response().Header().Set("Cache-Control", fmt.Sprintf("max-age=%d", ttl)) + if match := c.Request().Header.Get("If-None-Match"); match != "" { + if strings.Contains(match, etag) { + return c.NoContent(http.StatusNotModified) + } + } + } + + return next(c) + } + } +} diff --git a/internal/server/server.go b/internal/server/server.go index a065dcb..a1316fa 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -102,6 +102,7 @@ func NewRouter(fs embed.FS, debug bool, secret string, origins []string) *echo.E e.Use(middleware.CORSWithConfig(middleware.CORSConfig{AllowOrigins: origins})) e.Use(sentryecho.New(sentryecho.Options{})) e.Use(SentryTracingMiddleware) + e.Use(CachingMiddleware(0, "js", "css", "png", "ico")) e.Use(session.Middleware(sessions.NewCookieStore([]byte(secret)))) // static assets e.StaticFS("/static", echo.MustSubFS(fs, "assets"))