-
-
Notifications
You must be signed in to change notification settings - Fork 1.8k
♻️ refactor: Change c.Redirect() default status #3415
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
54e8138
1140672
2779e5c
b17b5ad
cf68f93
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -256,7 +256,7 @@ The route method is now like [`Express`](https://expressjs.com/de/api.html#app.r | |
|
||
```diff | ||
- Route(prefix string, fn func(router Router), name ...string) Router | ||
+ Route(path string) Register | ||
+ Route(path string) Register | ||
``` | ||
|
||
<details> | ||
|
@@ -299,7 +299,7 @@ Registering a subapp is now also possible via the [`Use`](./api/app#use) method | |
// register mulitple prefixes | ||
app.Use(["/v1", "/v2"], func(c fiber.Ctx) error { | ||
// Middleware for /v1 and /v2 | ||
return c.Next() | ||
return c.Next() | ||
}) | ||
|
||
// define subapp | ||
|
@@ -577,6 +577,9 @@ In this example, the `Bind` method is used to bind the request body to the `User | |
|
||
Fiber v3 enhances the redirect functionality by introducing new methods and improving existing ones. The new redirect methods provide more flexibility and control over the redirection process. | ||
|
||
The default response status is changes from 302 Found to 303 See Other for more | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This statement needs work. It should be a separate section. |
||
predictable behavior across browsers. | ||
|
||
### New Methods | ||
|
||
- `Redirect().To()`: Redirects to a specific URL. | ||
|
@@ -826,7 +829,7 @@ The adaptor middleware has been significantly optimized for performance and effi | |
|
||
### Cache | ||
|
||
We are excited to introduce a new option in our caching middleware: Cache Invalidator. This feature provides greater control over cache management, allowing you to define a custom conditions for invalidating cache entries. | ||
We are excited to introduce a new option in our caching middleware: Cache Invalidator. This feature provides greater control over cache management, allowing you to define a custom conditions for invalidating cache entries. | ||
Additionally, the caching middleware has been optimized to avoid caching non-cacheable status codes, as defined by the [HTTP standards](https://datatracker.ietf.org/doc/html/rfc7231#section-6.1). This improvement enhances cache accuracy and reduces unnecessary cache storage usage. | ||
|
||
### CORS | ||
|
@@ -947,7 +950,7 @@ Logger provides predefined formats that you can use by name or directly by speci | |
|
||
```go | ||
app.Use(logger.New(logger.Config{ | ||
Format: logger.FormatCombined, | ||
Format: logger.FormatCombined, | ||
})) | ||
``` | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -81,9 +81,9 @@ func Test_Expvar_Other_Path(t *testing.T) { | |
return c.SendString("escaped") | ||
}) | ||
|
||
resp, err := app.Test(httptest.NewRequest(fiber.MethodGet, "/debug/vars/302", nil)) | ||
resp, err := app.Test(httptest.NewRequest(fiber.MethodGet, "/debug/vars/303", nil)) | ||
require.NoError(t, err) | ||
require.Equal(t, 302, resp.StatusCode) | ||
require.Equal(t, 303, resp.StatusCode) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Use fiber.StatusSeeOther |
||
} | ||
|
||
// go test -run Test_Expvar_Next | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -19,10 +19,11 @@ func Test_Redirect_To(t *testing.T) { | |
t.Parallel() | ||
app := New() | ||
c := app.AcquireCtx(&fasthttp.RequestCtx{}) | ||
defer app.ReleaseCtx(c) | ||
|
||
err := c.Redirect().To("http://default.com") | ||
require.NoError(t, err) | ||
require.Equal(t, 302, c.Response().StatusCode()) | ||
require.Equal(t, 303, c.Response().StatusCode()) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Use fiber.StatusSeeOther |
||
require.Equal(t, "http://default.com", string(c.Response().Header.Peek(HeaderLocation))) | ||
|
||
err = c.Redirect().Status(301).To("http://example.com") | ||
|
@@ -39,7 +40,7 @@ func Test_Redirect_To_WithFlashMessages(t *testing.T) { | |
|
||
err := c.Redirect().With("success", "2").With("success", "1").With("message", "test", 2).To("http://example.com") | ||
require.NoError(t, err) | ||
require.Equal(t, 302, c.Response().StatusCode()) | ||
require.Equal(t, 303, c.Response().StatusCode()) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Use fiber.StatusSeeOther |
||
require.Equal(t, "http://example.com", string(c.Response().Header.Peek(HeaderLocation))) | ||
|
||
c.RequestCtx().Request.Header.Set(HeaderCookie, c.GetRespHeader(HeaderSetCookie)) // necessary for testing | ||
|
@@ -68,7 +69,7 @@ func Test_Redirect_Route_WithParams(t *testing.T) { | |
}, | ||
}) | ||
require.NoError(t, err) | ||
require.Equal(t, 302, c.Response().StatusCode()) | ||
require.Equal(t, 303, c.Response().StatusCode()) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Use fiber.StatusSeeOther |
||
require.Equal(t, "/user/fiber", string(c.Response().Header.Peek(HeaderLocation))) | ||
} | ||
|
||
|
@@ -88,7 +89,7 @@ func Test_Redirect_Route_WithParams_WithQueries(t *testing.T) { | |
Queries: map[string]string{"data[0][name]": "john", "data[0][age]": "10", "test": "doe"}, | ||
}) | ||
require.NoError(t, err) | ||
require.Equal(t, 302, c.Response().StatusCode()) | ||
require.Equal(t, 303, c.Response().StatusCode()) | ||
|
||
// analysis of query parameters with url parsing, since a map pass is always randomly ordered | ||
location, err := url.Parse(string(c.Response().Header.Peek(HeaderLocation))) | ||
|
@@ -112,7 +113,7 @@ func Test_Redirect_Route_WithOptionalParams(t *testing.T) { | |
}, | ||
}) | ||
require.NoError(t, err) | ||
require.Equal(t, 302, c.Response().StatusCode()) | ||
require.Equal(t, 303, c.Response().StatusCode()) | ||
require.Equal(t, "/user/fiber", string(c.Response().Header.Peek(HeaderLocation))) | ||
} | ||
|
||
|
@@ -127,7 +128,7 @@ func Test_Redirect_Route_WithOptionalParamsWithoutValue(t *testing.T) { | |
|
||
err := c.Redirect().Route("user") | ||
require.NoError(t, err) | ||
require.Equal(t, 302, c.Response().StatusCode()) | ||
require.Equal(t, 303, c.Response().StatusCode()) | ||
require.Equal(t, "/user/", string(c.Response().Header.Peek(HeaderLocation))) | ||
} | ||
|
||
|
@@ -146,7 +147,7 @@ func Test_Redirect_Route_WithGreedyParameters(t *testing.T) { | |
}, | ||
}) | ||
require.NoError(t, err) | ||
require.Equal(t, 302, c.Response().StatusCode()) | ||
require.Equal(t, 303, c.Response().StatusCode()) | ||
require.Equal(t, "/user/test/routes", string(c.Response().Header.Peek(HeaderLocation))) | ||
} | ||
|
||
|
@@ -161,7 +162,7 @@ func Test_Redirect_Back(t *testing.T) { | |
|
||
err := c.Redirect().Back("/") | ||
require.NoError(t, err) | ||
require.Equal(t, 302, c.Response().StatusCode()) | ||
require.Equal(t, 303, c.Response().StatusCode()) | ||
require.Equal(t, "/", string(c.Response().Header.Peek(HeaderLocation))) | ||
|
||
err = c.Redirect().Back() | ||
|
@@ -182,7 +183,7 @@ func Test_Redirect_Back_WithFlashMessages(t *testing.T) { | |
|
||
err := c.Redirect().With("success", "1").With("message", "test").Back("/") | ||
require.NoError(t, err) | ||
require.Equal(t, 302, c.Response().StatusCode()) | ||
require.Equal(t, 303, c.Response().StatusCode()) | ||
require.Equal(t, "/", string(c.Response().Header.Peek(HeaderLocation))) | ||
|
||
c.RequestCtx().Request.Header.Set(HeaderCookie, c.GetRespHeader(HeaderSetCookie)) // necessary for testing | ||
|
@@ -211,7 +212,7 @@ func Test_Redirect_Back_WithReferer(t *testing.T) { | |
c.Request().Header.Set(HeaderReferer, "/back") | ||
err := c.Redirect().Back("/") | ||
require.NoError(t, err) | ||
require.Equal(t, 302, c.Response().StatusCode()) | ||
require.Equal(t, 303, c.Response().StatusCode()) | ||
require.Equal(t, "/back", c.Get(HeaderReferer)) | ||
require.Equal(t, "/back", string(c.Response().Header.Peek(HeaderLocation))) | ||
} | ||
|
@@ -233,7 +234,7 @@ func Test_Redirect_Route_WithFlashMessages(t *testing.T) { | |
require.Contains(t, c.redirect.messages, redirectionMsg{key: "message", value: "test", level: 0, isOldInput: false}) | ||
|
||
require.NoError(t, err) | ||
require.Equal(t, 302, c.Response().StatusCode()) | ||
require.Equal(t, 303, c.Response().StatusCode()) | ||
require.Equal(t, "/user", string(c.Response().Header.Peek(HeaderLocation))) | ||
|
||
c.RequestCtx().Request.Header.Set(HeaderCookie, c.GetRespHeader(HeaderSetCookie)) // necessary for testing | ||
|
@@ -270,7 +271,7 @@ func Test_Redirect_Route_WithOldInput(t *testing.T) { | |
require.Contains(t, c.redirect.messages, redirectionMsg{key: "name", value: "tom", isOldInput: true}) | ||
|
||
require.NoError(t, err) | ||
require.Equal(t, 302, c.Response().StatusCode()) | ||
require.Equal(t, 303, c.Response().StatusCode()) | ||
require.Equal(t, "/user", string(c.Response().Header.Peek(HeaderLocation))) | ||
|
||
c.RequestCtx().Request.Header.Set(HeaderCookie, c.GetRespHeader(HeaderSetCookie)) // necessary for testing | ||
|
@@ -306,7 +307,7 @@ func Test_Redirect_Route_WithOldInput(t *testing.T) { | |
require.Contains(t, c.redirect.messages, redirectionMsg{key: "name", value: "tom", isOldInput: true}) | ||
|
||
require.NoError(t, err) | ||
require.Equal(t, 302, c.Response().StatusCode()) | ||
require.Equal(t, 303, c.Response().StatusCode()) | ||
require.Equal(t, "/user", string(c.Response().Header.Peek(HeaderLocation))) | ||
|
||
c.RequestCtx().Request.Header.Set(HeaderCookie, c.GetRespHeader(HeaderSetCookie)) // necessary for testing | ||
|
@@ -350,7 +351,7 @@ func Test_Redirect_Route_WithOldInput(t *testing.T) { | |
require.Contains(t, c.redirect.messages, redirectionMsg{key: "name", value: "tom", isOldInput: true}) | ||
|
||
require.NoError(t, err) | ||
require.Equal(t, 302, c.Response().StatusCode()) | ||
require.Equal(t, 303, c.Response().StatusCode()) | ||
require.Equal(t, "/user", string(c.Response().Header.Peek(HeaderLocation))) | ||
|
||
c.RequestCtx().Request.Header.Set(HeaderCookie, c.GetRespHeader(HeaderSetCookie)) // necessary for testing | ||
|
@@ -480,7 +481,7 @@ func Benchmark_Redirect_Route(b *testing.B) { | |
} | ||
|
||
require.NoError(b, err) | ||
require.Equal(b, 302, c.Response().StatusCode()) | ||
require.Equal(b, 303, c.Response().StatusCode()) | ||
require.Equal(b, "/user/fiber", string(c.Response().Header.Peek(HeaderLocation))) | ||
} | ||
|
||
|
@@ -508,7 +509,7 @@ func Benchmark_Redirect_Route_WithQueries(b *testing.B) { | |
} | ||
|
||
require.NoError(b, err) | ||
require.Equal(b, 302, c.Response().StatusCode()) | ||
require.Equal(b, 303, c.Response().StatusCode()) | ||
// analysis of query parameters with url parsing, since a map pass is always randomly ordered | ||
location, err := url.Parse(string(c.Response().Header.Peek(HeaderLocation))) | ||
require.NoError(b, err, "url.Parse(location)") | ||
|
@@ -535,7 +536,7 @@ func Benchmark_Redirect_Route_WithFlashMessages(b *testing.B) { | |
} | ||
|
||
require.NoError(b, err) | ||
require.Equal(b, 302, c.Response().StatusCode()) | ||
require.Equal(b, 303, c.Response().StatusCode()) | ||
require.Equal(b, "/user", string(c.Response().Header.Peek(HeaderLocation))) | ||
|
||
c.RequestCtx().Request.Header.Set(HeaderCookie, c.GetRespHeader(HeaderSetCookie)) // necessary for testing | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why was this changed?