1
0
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:
Vishal Rana
2016-04-12 22:39:29 -07:00
parent 6c27cffc66
commit b9aa2181b0
7 changed files with 81 additions and 5 deletions

View File

@ -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)
}