From 85a5fb8cf2db3255a3116551bf6f661b2c174d66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sigmund=20Xia=20=E5=A4=8F=E5=A4=A9=E7=9D=BF?= Date: Thu, 3 Oct 2024 22:19:27 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=A9=B9Fix:=20Adaptor=20middleware=20dupli?= =?UTF-8?q?cates=20cookies=20(#3151)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🩹Fix: Adaptor middleware duplicates cookies * 🩹Fix: add extra cases for Test_HTTPMiddlewareWithCookies --------- Co-authored-by: Juan Calderon-Perez <835733+gaby@users.noreply.github.com> --- middleware/adaptor/adaptor.go | 2 + middleware/adaptor/adaptor_test.go | 76 ++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/middleware/adaptor/adaptor.go b/middleware/adaptor/adaptor.go index a5040b39ae..03c6287e6f 100644 --- a/middleware/adaptor/adaptor.go +++ b/middleware/adaptor/adaptor.go @@ -101,6 +101,8 @@ func HTTPMiddleware(mw func(http.Handler) http.Handler) fiber.Handler { c.Request().SetHost(r.Host) c.Request().Header.SetHost(r.Host) + // Remove all cookies before setting, see https://github.com/valyala/fasthttp/pull/1864 + c.Request().Header.DelAllCookies() for key, val := range r.Header { for _, v := range val { c.Request().Header.Set(key, v) diff --git a/middleware/adaptor/adaptor_test.go b/middleware/adaptor/adaptor_test.go index c703d38436..990d421dec 100644 --- a/middleware/adaptor/adaptor_test.go +++ b/middleware/adaptor/adaptor_test.go @@ -10,6 +10,7 @@ import ( "net/http" "net/http/httptest" "net/url" + "strings" "testing" "github.com/gofiber/fiber/v3" @@ -200,6 +201,81 @@ func Test_HTTPMiddleware(t *testing.T) { require.Equal(t, "okay", resp.Header.Get("context_second_okay")) } +func Test_HTTPMiddlewareWithCookies(t *testing.T) { + const ( + cookieHeader = "Cookie" + setCookieHeader = "Set-Cookie" + cookieOneName = "cookieOne" + cookieTwoName = "cookieTwo" + cookieOneValue = "valueCookieOne" + cookieTwoValue = "valueCookieTwo" + ) + nethttpMW := func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + w.WriteHeader(http.StatusMethodNotAllowed) + return + } + next.ServeHTTP(w, r) + }) + } + + app := fiber.New() + app.Use(HTTPMiddleware(nethttpMW)) + app.Post("/", func(c fiber.Ctx) error { + // RETURNING CURRENT COOKIES TO RESPONSE + var cookies []string = strings.Split(c.Get(cookieHeader), "; ") + for _, cookie := range cookies { + c.Set(setCookieHeader, cookie) + } + return c.SendStatus(fiber.StatusOK) + }) + + // Test case for POST request with cookies + t.Run("POST request with cookies", func(t *testing.T) { + req, err := http.NewRequestWithContext(context.Background(), fiber.MethodPost, "/", nil) + require.NoError(t, err) + req.AddCookie(&http.Cookie{Name: cookieOneName, Value: cookieOneValue}) + req.AddCookie(&http.Cookie{Name: cookieTwoName, Value: cookieTwoValue}) + + resp, err := app.Test(req) + require.NoError(t, err) + cookies := resp.Cookies() + require.Len(t, cookies, 2) + for _, cookie := range cookies { + switch cookie.Name { + case cookieOneName: + require.Equal(t, cookieOneValue, cookie.Value) + case cookieTwoName: + require.Equal(t, cookieTwoValue, cookie.Value) + default: + t.Error("unexpected cookie key") + } + } + }) + + // New test case for GET request + t.Run("GET request", func(t *testing.T) { + req, err := http.NewRequestWithContext(context.Background(), fiber.MethodGet, "/", nil) + require.NoError(t, err) + + resp, err := app.Test(req) + require.NoError(t, err) + require.Equal(t, http.StatusMethodNotAllowed, resp.StatusCode) + }) + + // New test case for request without cookies + t.Run("POST request without cookies", func(t *testing.T) { + req, err := http.NewRequestWithContext(context.Background(), fiber.MethodPost, "/", nil) + require.NoError(t, err) + + resp, err := app.Test(req) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) + require.Empty(t, resp.Cookies()) + }) +} + func Test_FiberHandler(t *testing.T) { testFiberToHandlerFunc(t, false) }