From 5b5799fb105b8aa6aedc1e0197e97708d6eb5499 Mon Sep 17 00:00:00 2001 From: Dragan Vujanovic Date: Thu, 17 Oct 2024 13:20:35 +0200 Subject: [PATCH 1/3] Use cache interface instead of freecache --- cache.go | 15 ++++++++++----- cache_test.go | 10 +++++++++- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/cache.go b/cache.go index 828f06b..e1cf1bf 100644 --- a/cache.go +++ b/cache.go @@ -5,7 +5,6 @@ import ( "net/http" "time" - "github.com/coocood/freecache" "github.com/labstack/echo/v4" "github.com/mcuadros/go-defaults" ) @@ -28,7 +27,13 @@ type Config struct { Cache func(r *http.Request) bool } -func New(cfg *Config, cache *freecache.Cache) echo.MiddlewareFunc { +type Cache interface { + Set(key, value []byte, ttl int) error + Get(key []byte) ([]byte, error) + GetNotFoundErr() error +} + +func New(cfg *Config, cache Cache) echo.MiddlewareFunc { if cfg == nil { cfg = &Config{} } @@ -40,7 +45,7 @@ func New(cfg *Config, cache *freecache.Cache) echo.MiddlewareFunc { type CacheMiddleware struct { cfg *Config - cache *freecache.Cache + cache Cache } func (m *CacheMiddleware) Handler(next echo.HandlerFunc) echo.HandlerFunc { @@ -59,7 +64,7 @@ func (m *CacheMiddleware) Handler(next echo.HandlerFunc) echo.HandlerFunc { return nil } - if err != freecache.ErrNotFound { + if err != m.cache.GetNotFoundErr() { c.Logger().Errorf("error reading cache: %s", err) } @@ -77,7 +82,7 @@ func (m *CacheMiddleware) Handler(next echo.HandlerFunc) echo.HandlerFunc { func (m *CacheMiddleware) readCache(key []byte, c echo.Context) error { if m.cfg.Refresh != nil && m.cfg.Refresh(c.Request()) { - return freecache.ErrNotFound + return m.cache.GetNotFoundErr() } value, err := m.cache.Get(key) diff --git a/cache_test.go b/cache_test.go index e26c79d..82efaf0 100644 --- a/cache_test.go +++ b/cache_test.go @@ -153,11 +153,19 @@ func getCachedServer(t *testing.T, cfg *Config) *httptest.Server { return getCachedServerWithCode(t, cfg, http.StatusOK) } +type frecacheWrapper struct { + *freecache.Cache +} + +func (f frecacheWrapper) GetNotFoundErr() error { + return freecache.ErrNotFound +} + func getCachedServerWithCode(t *testing.T, cfg *Config, status int) *httptest.Server { e := echo.New() var i int - h := New(cfg, freecache.NewCache(42*1024*1024))(func(c echo.Context) error { + h := New(cfg, frecacheWrapper{freecache.NewCache(42 * 1024 * 1024)})(func(c echo.Context) error { i++ return c.String(status, fmt.Sprintf("test_%d", i)) }) From 9547d4b486998d0e92773484a31506e01603e688 Mon Sep 17 00:00:00 2001 From: Dragan Vujanovic Date: Thu, 17 Oct 2024 13:26:51 +0200 Subject: [PATCH 2/3] Make it backwards compatible --- cache.go | 16 +++++++++++++--- cache_test.go | 10 +--------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/cache.go b/cache.go index e1cf1bf..87b1519 100644 --- a/cache.go +++ b/cache.go @@ -5,6 +5,7 @@ import ( "net/http" "time" + "github.com/coocood/freecache" "github.com/labstack/echo/v4" "github.com/mcuadros/go-defaults" ) @@ -25,12 +26,18 @@ type Config struct { // Cache fuction called before cache a request, if false, the request is not // cached. If set Method is ignored. Cache func(r *http.Request) bool + // GetNotFoundErr is a function that returns the error that signals that the cache entry was not found. + // To maintain backwards compatibility, the default value which it returns is freecache.ErrNotFound + GetNotFoundErr func() error +} + +func defaultGetNotFoundErr() error { + return freecache.ErrNotFound } type Cache interface { Set(key, value []byte, ttl int) error Get(key []byte) ([]byte, error) - GetNotFoundErr() error } func New(cfg *Config, cache Cache) echo.MiddlewareFunc { @@ -39,6 +46,9 @@ func New(cfg *Config, cache Cache) echo.MiddlewareFunc { } defaults.SetDefaults(cfg) + if cfg.GetNotFoundErr == nil { + cfg.GetNotFoundErr = defaultGetNotFoundErr + } m := &CacheMiddleware{cfg: cfg, cache: cache} return m.Handler } @@ -64,7 +74,7 @@ func (m *CacheMiddleware) Handler(next echo.HandlerFunc) echo.HandlerFunc { return nil } - if err != m.cache.GetNotFoundErr() { + if err != m.cfg.GetNotFoundErr() { c.Logger().Errorf("error reading cache: %s", err) } @@ -82,7 +92,7 @@ func (m *CacheMiddleware) Handler(next echo.HandlerFunc) echo.HandlerFunc { func (m *CacheMiddleware) readCache(key []byte, c echo.Context) error { if m.cfg.Refresh != nil && m.cfg.Refresh(c.Request()) { - return m.cache.GetNotFoundErr() + return m.cfg.GetNotFoundErr() } value, err := m.cache.Get(key) diff --git a/cache_test.go b/cache_test.go index 82efaf0..e26c79d 100644 --- a/cache_test.go +++ b/cache_test.go @@ -153,19 +153,11 @@ func getCachedServer(t *testing.T, cfg *Config) *httptest.Server { return getCachedServerWithCode(t, cfg, http.StatusOK) } -type frecacheWrapper struct { - *freecache.Cache -} - -func (f frecacheWrapper) GetNotFoundErr() error { - return freecache.ErrNotFound -} - func getCachedServerWithCode(t *testing.T, cfg *Config, status int) *httptest.Server { e := echo.New() var i int - h := New(cfg, frecacheWrapper{freecache.NewCache(42 * 1024 * 1024)})(func(c echo.Context) error { + h := New(cfg, freecache.NewCache(42*1024*1024))(func(c echo.Context) error { i++ return c.String(status, fmt.Sprintf("test_%d", i)) }) From 267137944eb9d470203a84f2006a8cbeb1f57d42 Mon Sep 17 00:00:00 2001 From: Dragan Vujanovic Date: Thu, 17 Oct 2024 13:29:03 +0200 Subject: [PATCH 3/3] Use errors is for error checking --- cache.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cache.go b/cache.go index 87b1519..d3d7280 100644 --- a/cache.go +++ b/cache.go @@ -1,6 +1,7 @@ package cache import ( + "errors" "fmt" "net/http" "time" @@ -74,7 +75,7 @@ func (m *CacheMiddleware) Handler(next echo.HandlerFunc) echo.HandlerFunc { return nil } - if err != m.cfg.GetNotFoundErr() { + if !errors.Is(err, m.cfg.GetNotFoundErr()) { c.Logger().Errorf("error reading cache: %s", err) }