Skip to content

Commit cdb8e6b

Browse files
committed
fix(router): walk parent tree for RouteNotFound handler in groups
When a route exists in the router but the HTTP method is not allowed, the router previously always fell back to methodNotAllowedHandler. However, this bypassed any RouteNotFound handler registered at a parent or root level, which is the expected behavior when using echo.Group(). This fix traverses the parent node chain to look for a notFoundHandler, allowing RouteNotFound middleware defined at a higher group level to properly handle 404-like responses for sub-groups. Fixes #2485 Signed-off-by: lyydsheep <2230561977@qq.com>
1 parent ec05bc8 commit cdb8e6b

File tree

1 file changed

+21
-5
lines changed

1 file changed

+21
-5
lines changed

router.go

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,12 +1011,28 @@ func (r *DefaultRouter) Route(c *Context) HandlerFunc {
10111011
rPath = matchedRouteMethod.Path
10121012
rHandler = matchedRouteMethod.handler
10131013
} else if currentNode.isHandler {
1014-
rInfo = methodNotAllowedRouteInfo
1014+
// Walk up the tree to find a parent's notFoundHandler
1015+
// This allows RouteNotFound handlers defined at a higher level in the tree
1016+
// (e.g., root level) to handle 404s for sub-paths (e.g., groups)
1017+
var parentNode *node
1018+
for parentNode = currentNode.parent; parentNode != nil; parentNode = parentNode.parent {
1019+
if parentNode.methods.notFoundHandler != nil {
1020+
matchedRouteMethod = parentNode.methods.notFoundHandler
1021+
rInfo = matchedRouteMethod.RouteInfo
1022+
rPath = matchedRouteMethod.Path
1023+
rHandler = matchedRouteMethod.handler
1024+
break
1025+
}
1026+
}
10151027

1016-
c.Set(ContextKeyHeaderAllow, currentNode.methods.allowHeader)
1017-
rHandler = r.methodNotAllowedHandler
1018-
if req.Method == http.MethodOptions {
1019-
rHandler = r.optionsMethodHandler
1028+
// If no parent notFoundHandler was found, use methodNotAllowedHandler
1029+
if rHandler == nil {
1030+
rInfo = methodNotAllowedRouteInfo
1031+
c.Set(ContextKeyHeaderAllow, currentNode.methods.allowHeader)
1032+
rHandler = r.methodNotAllowedHandler
1033+
if req.Method == http.MethodOptions {
1034+
rHandler = r.optionsMethodHandler
1035+
}
10201036
}
10211037
}
10221038
}

0 commit comments

Comments
 (0)