Skip to content

Commit 2eb5d97

Browse files
Russ Eganvishr
authored andcommitted
Fix issue with middleware from one route leaking into the middleware of other routes
Fixed #565 Signed-off-by: Vishal Rana <vr@labstack.com>
1 parent 1ca76e5 commit 2eb5d97

File tree

3 files changed

+35
-6
lines changed

3 files changed

+35
-6
lines changed

echo.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,6 @@ func (e *Echo) add(method, path string, handler HandlerFunc, middleware ...Middl
476476
Handler: name,
477477
}
478478
e.router.routes[method+path] = r
479-
// e.router.routes = append(e.router.routes, r)
480479
}
481480

482481
// Group creates a new router group with prefix and optional group-level middleware.

group.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,10 @@ func (g *Group) Match(methods []string, path string, handler HandlerFunc, middle
126126
}
127127

128128
// Group creates a new sub-group with prefix and optional sub-group-level middleware.
129-
func (g *Group) Group(prefix string, m ...MiddlewareFunc) *Group {
130-
m = append(g.middleware, m...)
129+
func (g *Group) Group(prefix string, middleware ...MiddlewareFunc) *Group {
130+
m := []MiddlewareFunc{}
131+
m = append(m, g.middleware...)
132+
m = append(m, middleware...)
131133
return g.echo.Group(g.prefix+prefix, m...)
132134
}
133135

@@ -142,6 +144,11 @@ func (g *Group) File(path, file string) {
142144
}
143145

144146
func (g *Group) add(method, path string, handler HandlerFunc, middleware ...MiddlewareFunc) {
145-
middleware = append(g.middleware, middleware...)
146-
g.echo.add(method, g.prefix+path, handler, middleware...)
147+
// Combine into a new slice, to avoid accidentally passing the same
148+
// slice for multiple routes, which would lead to later add() calls overwriting
149+
// the middleware from earlier calls
150+
m := []MiddlewareFunc{}
151+
m = append(m, g.middleware...)
152+
m = append(m, middleware...)
153+
g.echo.add(method, g.prefix+path, handler, m...)
147154
}

group_test.go

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package echo
22

3-
import "testing"
3+
import (
4+
"github.com/stretchr/testify/assert"
5+
"testing"
6+
)
47

58
// TODO: Fix me
69
func TestGroup(t *testing.T) {
@@ -29,3 +32,23 @@ func TestGroup(t *testing.T) {
2932
g.Static("/static", "/tmp")
3033
g.File("/walle", "_fixture/images//walle.png")
3134
}
35+
36+
func TestGroupRouteMiddleware(t *testing.T) {
37+
// Ensure middleware slices are not re-used
38+
e := New()
39+
g := e.Group("/group")
40+
h := func(Context) error { return nil }
41+
m1 := WrapMiddleware(func(c Context) error { return nil })
42+
m2 := WrapMiddleware(func(c Context) error { return nil })
43+
m3 := WrapMiddleware(func(c Context) error { return nil })
44+
m4 := WrapMiddleware(func(c Context) error { return c.NoContent(404) })
45+
m5 := WrapMiddleware(func(c Context) error { return c.NoContent(405) })
46+
g.Use(m1, m2, m3)
47+
g.GET("/404", h, m4)
48+
g.GET("/405", h, m5)
49+
50+
c, _ := request(GET, "/group/404", e)
51+
assert.Equal(t, 404, c)
52+
c, _ = request(GET, "/group/405", e)
53+
assert.Equal(t, 405, c)
54+
}

0 commit comments

Comments
 (0)