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..a8a9613f84 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,49 @@ func Test_HTTPMiddleware(t *testing.T) { require.Equal(t, "okay", resp.Header.Get("context_second_okay")) } +func Test_HTTPMiddlewareWithCookies(t *testing.T) { + 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("Cookie"), "; ") + for _, cookie := range cookies { + c.Set("Set-Cookie", cookie) + } + return c.SendStatus(fiber.StatusOK) + }) + + req, err := http.NewRequestWithContext(context.Background(), fiber.MethodPost, "/", nil) + require.NoError(t, err) + req.AddCookie(&http.Cookie{Name: "cookieOne", Value: "valueCookieOne"}) + req.AddCookie(&http.Cookie{Name: "cookieTwo", Value: "valueCookieTwo"}) + + 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 "cookieOne": + require.Equal(t, "valueCookieOne", cookie.Value) + case "cookieTwo": + require.Equal(t, "valueCookieTwo", cookie.Value) + default: + t.Error("unexpected cookie key") + } + } +} + func Test_FiberHandler(t *testing.T) { testFiberToHandlerFunc(t, false) }