mirror of https://github.com/gofiber/fiber.git
🩹Fix: Adaptor middleware duplicates cookies (#3151)
* 🩹Fix: Adaptor middleware duplicates cookies * 🩹Fix: add extra cases for Test_HTTPMiddlewareWithCookies --------- Co-authored-by: Juan Calderon-Perez <835733+gaby@users.noreply.github.com>pull/3154/head^2
parent
44cd700ad5
commit
85a5fb8cf2
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue