Skip to content
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

Group middleware does not work for "Any" route #2517

Open
KaymeKaydex opened this issue Sep 6, 2023 · 1 comment
Open

Group middleware does not work for "Any" route #2517

KaymeKaydex opened this issue Sep 6, 2023 · 1 comment

Comments

@KaymeKaydex
Copy link

Issue Description

Checklist

  • [ + ] Dependencies installed
  • [ + ] No typos
  • [ + ] Searched existing issues and docs

Expected behaviour

normal routing

Actual behaviour

{
"message": "Not Found"
}

Steps to reproduce

just create any request

Working code to debug

	g := e.Group("/api/test") 
	g.Use(echo.WrapMiddleware(mw.NewMW()))
	{
		g.Any("*", testController.Proxy) 
	}

actual result is 
{
    "message": "Not Found"
}
but route cant return anything

Version/commit

github.com/labstack/echo/v4 v4.11.1

@KaymeKaydex KaymeKaydex changed the title group middleware does not work for any route Group middleware does not work for "Any" route Sep 6, 2023
@aldas
Copy link
Contributor

aldas commented Sep 6, 2023

This is little bit tricky.

Let assume group and handler is added like this:

func main() {
	e := echo.New()

	g := e.Group("/api/test")
	//g.Use(middleware.Logger())
	g.Any("*", func(c echo.Context) error {
		return c.String(http.StatusOK, c.Path())
	})

	if err := e.Start(":8080"); err != nil && !errors.Is(err, http.ErrServerClosed) {
		e.Logger.Fatal(err)
	}
}

When you add route with g.Any("*" you will end up with route path /api/test*. This will match both of following request

x@x:~/code$ curl http://localhost:8080/api/test/hi
/api/test*
x@x:~/code$ curl http://localhost:8080/api/testhi
/api/test*

as your router has following routes
image

now when we add middleware to that group by uncommenting g.Use(middleware.Logger())

we have following routes
image

that 4 is 404 route for path /api/test/* which is causing problem here as it is more precise match than api/test*.

x@x:~/code$ curl http://localhost:8080/api/testhi
/api/test*
x@x:~/code$ curl http://localhost:8080/api/test/hi
{"message":"Not Found"}

As a workaround I suggest:

  • adding that any route like that g.Any("/*" as it will then overwrite that 404 route.
  • or creating group like that g := e.Group("/api/test/")

That 404 route is a "feature" that is added here (line 32)

echo/group.go

Lines 21 to 32 in 77d5ae6

func (g *Group) Use(middleware ...MiddlewareFunc) {
g.middleware = append(g.middleware, middleware...)
if len(g.middleware) == 0 {
return
}
// group level middlewares are different from Echo `Pre` and `Use` middlewares (those are global). Group level middlewares
// are only executed if they are added to the Router with route.
// So we register catch all route (404 is a safe way to emulate route match) for this group and now during routing the
// Router would find route to match our request path and therefore guarantee the middleware(s) will get executed.
g.RouteNotFound("", NotFoundHandler)
g.RouteNotFound("/*", NotFoundHandler)
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants