56 lines
1.2 KiB
Go
56 lines
1.2 KiB
Go
package middleware
|
|
|
|
import (
|
|
"context"
|
|
|
|
"allaboutapps.dev/aw/go-starter/internal/util"
|
|
"github.com/labstack/echo/v4"
|
|
"github.com/labstack/echo/v4/middleware"
|
|
)
|
|
|
|
var (
|
|
DefaultCacheControlConfig = CacheControlConfig{
|
|
Skipper: middleware.DefaultSkipper,
|
|
}
|
|
)
|
|
|
|
type CacheControlConfig struct {
|
|
Skipper middleware.Skipper
|
|
}
|
|
|
|
func CacheControl() echo.MiddlewareFunc {
|
|
return CacheControlWithConfig(DefaultCacheControlConfig)
|
|
}
|
|
|
|
func CacheControlWithConfig(config CacheControlConfig) echo.MiddlewareFunc {
|
|
if config.Skipper == nil {
|
|
config.Skipper = DefaultCacheControlConfig.Skipper
|
|
}
|
|
|
|
return func(next echo.HandlerFunc) echo.HandlerFunc {
|
|
return func(c echo.Context) error {
|
|
if config.Skipper(c) {
|
|
return next(c)
|
|
}
|
|
|
|
cacheControl := c.Request().Header.Get(util.HTTPHeaderCacheControl)
|
|
if len(cacheControl) > 0 {
|
|
directive := util.ParseCacheControlHeader(cacheControl)
|
|
|
|
ctx := c.Request().Context()
|
|
|
|
l := util.LogFromContext(ctx).With().Str("cacheControl", directive.String()).Logger()
|
|
ctx = l.WithContext(ctx)
|
|
|
|
ctx = context.WithValue(ctx, util.CTXKeyCacheControl, directive)
|
|
|
|
l.Trace().Msg("Setting cache control directive for request")
|
|
|
|
c.SetRequest(c.Request().WithContext(ctx))
|
|
}
|
|
|
|
return next(c)
|
|
}
|
|
}
|
|
}
|