Skip to content

Commit f69e8e7

Browse files
authored
Merge pull request #290 from devfeel/aicode-issue-229
feat(group): add SetNotFoundHandle support for router groups
2 parents ae49f86 + 8817734 commit f69e8e7

4 files changed

Lines changed: 21 additions & 5 deletions

File tree

dotweb.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -563,11 +563,10 @@ func (app *DotWeb) initBindMiddleware() {
563563

564564
// bind group middlewares
565565
for _, g := range app.HttpServer.groups {
566-
xg := g.(*xGroup)
567-
if len(xg.middlewares) <= 0 {
566+
if len(g.middlewares) <= 0 {
568567
continue
569568
}
570-
for fullExpress, _ := range xg.allRouterExpress {
569+
for fullExpress, _ := range g.allRouterExpress {
571570
expresses := strings.Split(fullExpress, routerExpressSplit)
572571
if len(expresses) < 2 {
573572
continue
@@ -576,7 +575,7 @@ func (app *DotWeb) initBindMiddleware() {
576575
if node == nil {
577576
continue
578577
}
579-
node.groupMiddlewares = xg.middlewares
578+
node.groupMiddlewares = g.middlewares
580579
for _, m := range node.groupMiddlewares {
581580
if m.HasExclude() && m.ExistsExcludeRouter(node.fullPath) {
582581
app.Logger().Debug("DotWeb initBindMiddleware [group] "+fullExpress+" "+reflect.TypeOf(m).String()+" exclude", LogTarget_HttpServer)

group.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@ type (
1515
PUT(path string, h HttpHandle) RouterNode
1616
ServerFile(path string, fileroot string) RouterNode
1717
RegisterRoute(method, path string, h HttpHandle) RouterNode
18+
SetNotFoundHandle(handler StandardHandle) Group
1819
}
1920
xGroup struct {
2021
prefix string
2122
middlewares []Middleware
2223
allRouterExpress map[string]struct{}
2324
server *HttpServer
25+
notFoundHandler StandardHandle
2426
}
2527
)
2628

@@ -119,3 +121,10 @@ func (g *xGroup) add(method, path string, handler HttpHandle) RouterNode {
119121
node.Node().groupMiddlewares = g.middlewares
120122
return node
121123
}
124+
125+
// SetNotFoundHandle sets custom 404 handler for this group.
126+
// This handler takes priority over the app-level NotFoundHandler.
127+
func (g *xGroup) SetNotFoundHandle(handler StandardHandle) Group {
128+
g.notFoundHandler = handler
129+
return g
130+
}

router.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,14 @@ func (r *router) ServeHTTP(ctx Context) {
272272
}
273273

274274
// Handle 404
275+
// Check if request path matches any group prefix and use group's NotFoundHandler
276+
for _, g := range r.server.groups {
277+
if strings.HasPrefix(path, g.prefix) && g.notFoundHandler != nil {
278+
g.notFoundHandler(ctx)
279+
return
280+
}
281+
}
282+
// Fall back to app-level NotFoundHandler
275283
if r.server.DotApp.NotFoundHandler != nil {
276284
r.server.DotApp.NotFoundHandler(ctx)
277285
}

server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ type (
3030
HttpServer struct {
3131
stdServer *http.Server
3232
router Router
33-
groups []Group
33+
groups []*xGroup
3434
Modules []*HttpModule
3535
DotApp *DotWeb
3636
Validator Validator

0 commit comments

Comments
 (0)