1
0
mirror of https://github.com/labstack/echo.git synced 2024-12-24 20:14:31 +02:00

Middleware to add and remove trailing slash

Signed-off-by: Vishal Rana <vr@labstack.com>
This commit is contained in:
Vishal Rana 2016-03-31 12:17:18 -07:00
parent ba46c48cba
commit 1b3197a149
3 changed files with 73 additions and 1 deletions

View File

@ -12,7 +12,6 @@ import (
func TestRecover(t *testing.T) {
e := echo.New()
e.SetDebug(true)
buf := new(bytes.Buffer)
e.SetLogOutput(buf)
rq := test.NewRequest(echo.GET, "/", nil)

40
middleware/slash.go Normal file
View File

@ -0,0 +1,40 @@
package middleware
import (
"github.com/labstack/echo"
)
// 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 func(next echo.Handler) echo.Handler {
return echo.HandlerFunc(func(c echo.Context) error {
url := c.Request().URL()
path := url.Path()
if path != "/" && path[len(path)-1] != '/' {
url.SetPath(path + "/")
}
return next.Handle(c)
})
}
}
// RemoveTrailingSlash returns a root level (before router) middleware which removes
// a trailing slash from the request URI.
//
// Usage `Echo#Pre(RemoveTrailingSlash())`
func RemoveTrailingSlash() echo.MiddlewareFunc {
return func(next echo.Handler) echo.Handler {
return echo.HandlerFunc(func(c echo.Context) error {
url := c.Request().URL()
path := url.Path()
l := len(path) - 1
if path != "/" && path[l] == '/' {
url.SetPath(path[:l])
}
return next.Handle(c)
})
}
}

33
middleware/slash_test.go Normal file
View File

@ -0,0 +1,33 @@
package middleware
import (
"testing"
"github.com/labstack/echo"
"github.com/labstack/echo/test"
"github.com/stretchr/testify/assert"
)
func TestAddTrailingSlash(t *testing.T) {
e := echo.New()
rq := test.NewRequest(echo.GET, "/add-slash", nil)
rc := test.NewResponseRecorder()
c := echo.NewContext(rq, rc, e)
h := AddTrailingSlash()(echo.HandlerFunc(func(c echo.Context) error {
return nil
}))
h.Handle(c)
assert.Equal(t, "/add-slash/", rq.URL().Path())
}
func TestRemoveTrailingSlash(t *testing.T) {
e := echo.New()
rq := test.NewRequest(echo.GET, "/remove-slash/", nil)
rc := test.NewResponseRecorder()
c := echo.NewContext(rq, rc, e)
h := RemoveTrailingSlash()(echo.HandlerFunc(func(c echo.Context) error {
return nil
}))
h.Handle(c)
assert.Equal(t, "/remove-slash", rq.URL().Path())
}