From c9cb1e9e769dc86fcaf1d368e1daa71e8c596f22 Mon Sep 17 00:00:00 2001 From: Jesse Quinn Date: Sun, 23 Jan 2022 14:41:45 -0300 Subject: [PATCH 1/4] added HEAD method to caching --- middleware/cache/cache.go | 2 +- middleware/cache/cache_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/middleware/cache/cache.go b/middleware/cache/cache.go index 84652b28c0..4f1f5cc84b 100644 --- a/middleware/cache/cache.go +++ b/middleware/cache/cache.go @@ -58,7 +58,7 @@ func New(config ...Config) fiber.Handler { // Return new handler return func(c *fiber.Ctx) error { // Only cache GET methods - if c.Method() != fiber.MethodGet { + if c.Method() != fiber.MethodGet && c.Method() != fiber.MethodHead { c.Set(cfg.CacheHeader, cacheUnreachable) return c.Next() } diff --git a/middleware/cache/cache_test.go b/middleware/cache/cache_test.go index e8c272b990..7607832b24 100644 --- a/middleware/cache/cache_test.go +++ b/middleware/cache/cache_test.go @@ -341,6 +341,31 @@ func Test_CacheHeader(t *testing.T) { utils.AssertEqual(t, cacheUnreachable, errRespCached.Header.Get("X-Cache")) } +func Test_Cache_WithHead(t *testing.T) { + app := fiber.New() + app.Use(New()) + + app.Get("/", func(c *fiber.Ctx) error { + now := fmt.Sprintf("%d", time.Now().UnixNano()) + return c.SendString(now) + }) + + req := httptest.NewRequest("HEAD", "/", nil) + resp, err := app.Test(req) + utils.AssertEqual(t, cacheMiss, resp.Header.Get("X-Cache")) + + cachedReq := httptest.NewRequest("HEAD", "/", nil) + cachedResp, err := app.Test(cachedReq) + utils.AssertEqual(t, cacheHit, cachedResp.Header.Get("X-Cache")) + + body, err := ioutil.ReadAll(resp.Body) + utils.AssertEqual(t, nil, err) + cachedBody, err := ioutil.ReadAll(cachedResp.Body) + utils.AssertEqual(t, nil, err) + + utils.AssertEqual(t, cachedBody, body) +} + func Test_CustomCacheHeader(t *testing.T) { app := fiber.New() From 5e20c54dc4cda23ec60ae4fb325a9eca4a0c7990 Mon Sep 17 00:00:00 2001 From: Jesse Quinn Date: Sun, 23 Jan 2022 15:59:30 -0300 Subject: [PATCH 2/4] changed key due to head and get sharing same key --- middleware/cache/cache.go | 2 +- middleware/cache/cache_test.go | 36 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/middleware/cache/cache.go b/middleware/cache/cache.go index 4f1f5cc84b..98a98a1905 100644 --- a/middleware/cache/cache.go +++ b/middleware/cache/cache.go @@ -64,7 +64,7 @@ func New(config ...Config) fiber.Handler { } // Get key from request - key := cfg.KeyGenerator(c) + key := cfg.KeyGenerator(c) + "_" + c.Method() // Get entry from pool e := manager.get(key) diff --git a/middleware/cache/cache_test.go b/middleware/cache/cache_test.go index 7607832b24..9b301ad1bc 100644 --- a/middleware/cache/cache_test.go +++ b/middleware/cache/cache_test.go @@ -366,6 +366,42 @@ func Test_Cache_WithHead(t *testing.T) { utils.AssertEqual(t, cachedBody, body) } +func Test_Cache_WithHeadThenGet(t *testing.T) { + app := fiber.New() + app.Use(New()) + app.Get("/get", func(c *fiber.Ctx) error { + return c.SendString(c.Query("cache")) + }) + + headResp, err := app.Test(httptest.NewRequest("HEAD", "/head?cache=123", nil)) + utils.AssertEqual(t, nil, err) + headBody, err := ioutil.ReadAll(headResp.Body) + utils.AssertEqual(t, nil, err) + utils.AssertEqual(t, "", string(headBody)) + utils.AssertEqual(t, cacheMiss, headResp.Header.Get("X-Cache")) + + headResp, err = app.Test(httptest.NewRequest("HEAD", "/head?cache=123", nil)) + utils.AssertEqual(t, nil, err) + headBody, err = ioutil.ReadAll(headResp.Body) + utils.AssertEqual(t, nil, err) + utils.AssertEqual(t, "", string(headBody)) + utils.AssertEqual(t, cacheHit, headResp.Header.Get("X-Cache")) + + getResp, err := app.Test(httptest.NewRequest("GET", "/get?cache=123", nil)) + utils.AssertEqual(t, nil, err) + getBody, err := ioutil.ReadAll(getResp.Body) + utils.AssertEqual(t, nil, err) + utils.AssertEqual(t, "123", string(getBody)) + utils.AssertEqual(t, cacheMiss, getResp.Header.Get("X-Cache")) + + getResp, err = app.Test(httptest.NewRequest("GET", "/get?cache=123", nil)) + utils.AssertEqual(t, nil, err) + getBody, err = ioutil.ReadAll(getResp.Body) + utils.AssertEqual(t, nil, err) + utils.AssertEqual(t, "123", string(getBody)) + utils.AssertEqual(t, cacheHit, getResp.Header.Get("X-Cache")) +} + func Test_CustomCacheHeader(t *testing.T) { app := fiber.New() From e912b05ee6b9f46cc1926002bf5aabbb14634b3c Mon Sep 17 00:00:00 2001 From: RW Date: Mon, 24 Jan 2022 16:22:14 +0100 Subject: [PATCH 3/4] Update cache.go - add a improvement task for later --- middleware/cache/cache.go | 1 + 1 file changed, 1 insertion(+) diff --git a/middleware/cache/cache.go b/middleware/cache/cache.go index 98a98a1905..a09b4ee07b 100644 --- a/middleware/cache/cache.go +++ b/middleware/cache/cache.go @@ -64,6 +64,7 @@ func New(config ...Config) fiber.Handler { } // Get key from request + // TODO(allocation optimization): try to minimize the allocation from 2 to 1 key := cfg.KeyGenerator(c) + "_" + c.Method() // Get entry from pool From 402b8f9683fc1cae7d081f8e172b4b5ad9950ad2 Mon Sep 17 00:00:00 2001 From: RW Date: Mon, 24 Jan 2022 16:22:56 +0100 Subject: [PATCH 4/4] Update cache.go correct comment --- middleware/cache/cache.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/middleware/cache/cache.go b/middleware/cache/cache.go index a09b4ee07b..f27b7638ab 100644 --- a/middleware/cache/cache.go +++ b/middleware/cache/cache.go @@ -57,7 +57,7 @@ func New(config ...Config) fiber.Handler { // Return new handler return func(c *fiber.Ctx) error { - // Only cache GET methods + // Only cache GET and HEAD methods if c.Method() != fiber.MethodGet && c.Method() != fiber.MethodHead { c.Set(cfg.CacheHeader, cacheUnreachable) return c.Next()