mirror of
https://github.com/labstack/echo.git
synced 2025-07-15 01:34:53 +02:00
Trailing slash middleware with option to redirect
Signed-off-by: Vishal Rana <vr@labstack.com>
This commit is contained in:
@ -4,17 +4,39 @@ import (
|
||||
"github.com/labstack/echo"
|
||||
)
|
||||
|
||||
type (
|
||||
// TrailingSlashConfig defines the config for TrailingSlash middleware.
|
||||
TrailingSlashConfig struct {
|
||||
// RedirectCode is the status code used when redirecting the request.
|
||||
// Optional but when provided the request is redirected using this code.
|
||||
RedirectCode int
|
||||
}
|
||||
)
|
||||
|
||||
// AddTrailingSlash returns a root level (before router) middleware which adds a
|
||||
// trailing slash to the request `URL#Path`.
|
||||
//
|
||||
// Usage `Echo#Pre(AddTrailingSlash())`
|
||||
func AddTrailingSlash() echo.MiddlewareFunc {
|
||||
return AddTrailingSlashWithConfig(TrailingSlashConfig{})
|
||||
}
|
||||
|
||||
// AddTrailingSlashWithConfig returns a AddTrailingSlash middleware from config.
|
||||
// See `AddTrailingSlash()`.
|
||||
func AddTrailingSlashWithConfig(config TrailingSlashConfig) echo.MiddlewareFunc {
|
||||
return func(next echo.HandlerFunc) echo.HandlerFunc {
|
||||
return func(c echo.Context) error {
|
||||
url := c.Request().URL()
|
||||
rq := c.Request()
|
||||
url := rq.URL()
|
||||
path := url.Path()
|
||||
if path != "/" && path[len(path)-1] != '/' {
|
||||
url.SetPath(path + "/")
|
||||
path += "/"
|
||||
uri := path + "?" + url.QueryString()
|
||||
if config.RedirectCode != 0 {
|
||||
return c.Redirect(config.RedirectCode, uri)
|
||||
}
|
||||
rq.SetURI(uri)
|
||||
url.SetPath(path)
|
||||
}
|
||||
return next(c)
|
||||
}
|
||||
@ -26,13 +48,26 @@ func AddTrailingSlash() echo.MiddlewareFunc {
|
||||
//
|
||||
// Usage `Echo#Pre(RemoveTrailingSlash())`
|
||||
func RemoveTrailingSlash() echo.MiddlewareFunc {
|
||||
return RemoveTrailingSlashWithConfig(TrailingSlashConfig{})
|
||||
}
|
||||
|
||||
// RemoveTrailingSlashWithConfig returns a RemoveTrailingSlash middleware from config.
|
||||
// See `RemoveTrailingSlash()`.
|
||||
func RemoveTrailingSlashWithConfig(config TrailingSlashConfig) echo.MiddlewareFunc {
|
||||
return func(next echo.HandlerFunc) echo.HandlerFunc {
|
||||
return func(c echo.Context) error {
|
||||
url := c.Request().URL()
|
||||
rq := c.Request()
|
||||
url := rq.URL()
|
||||
path := url.Path()
|
||||
l := len(path) - 1
|
||||
if path != "/" && path[l] == '/' {
|
||||
url.SetPath(path[:l])
|
||||
path = path[:l]
|
||||
uri := path + "?" + url.QueryString()
|
||||
if config.RedirectCode != 0 {
|
||||
return c.Redirect(config.RedirectCode, uri)
|
||||
}
|
||||
rq.SetURI(uri)
|
||||
url.SetPath(path)
|
||||
}
|
||||
return next(c)
|
||||
}
|
||||
|
Reference in New Issue
Block a user