diff --git a/dotweb.go b/dotweb.go index 9f42176..949c5b5 100644 --- a/dotweb.go +++ b/dotweb.go @@ -563,11 +563,10 @@ func (app *DotWeb) initBindMiddleware() { // bind group middlewares for _, g := range app.HttpServer.groups { - xg := g.(*xGroup) - if len(xg.middlewares) <= 0 { + if len(g.middlewares) <= 0 { continue } - for fullExpress, _ := range xg.allRouterExpress { + for fullExpress, _ := range g.allRouterExpress { expresses := strings.Split(fullExpress, routerExpressSplit) if len(expresses) < 2 { continue @@ -576,7 +575,7 @@ func (app *DotWeb) initBindMiddleware() { if node == nil { continue } - node.groupMiddlewares = xg.middlewares + node.groupMiddlewares = g.middlewares for _, m := range node.groupMiddlewares { if m.HasExclude() && m.ExistsExcludeRouter(node.fullPath) { app.Logger().Debug("DotWeb initBindMiddleware [group] "+fullExpress+" "+reflect.TypeOf(m).String()+" exclude", LogTarget_HttpServer) diff --git a/group.go b/group.go index 2e8f516..55836d4 100644 --- a/group.go +++ b/group.go @@ -15,12 +15,14 @@ type ( PUT(path string, h HttpHandle) RouterNode ServerFile(path string, fileroot string) RouterNode RegisterRoute(method, path string, h HttpHandle) RouterNode + SetNotFoundHandle(handler StandardHandle) Group } xGroup struct { prefix string middlewares []Middleware allRouterExpress map[string]struct{} server *HttpServer + notFoundHandler StandardHandle } ) @@ -119,3 +121,10 @@ func (g *xGroup) add(method, path string, handler HttpHandle) RouterNode { node.Node().groupMiddlewares = g.middlewares return node } + +// SetNotFoundHandle sets custom 404 handler for this group. +// This handler takes priority over the app-level NotFoundHandler. +func (g *xGroup) SetNotFoundHandle(handler StandardHandle) Group { + g.notFoundHandler = handler + return g +} diff --git a/router.go b/router.go index 4ae3b87..6b7d2ae 100644 --- a/router.go +++ b/router.go @@ -272,6 +272,14 @@ func (r *router) ServeHTTP(ctx Context) { } // Handle 404 + // Check if request path matches any group prefix and use group's NotFoundHandler + for _, g := range r.server.groups { + if strings.HasPrefix(path, g.prefix) && g.notFoundHandler != nil { + g.notFoundHandler(ctx) + return + } + } + // Fall back to app-level NotFoundHandler if r.server.DotApp.NotFoundHandler != nil { r.server.DotApp.NotFoundHandler(ctx) } diff --git a/server.go b/server.go index af332da..b2b19ca 100644 --- a/server.go +++ b/server.go @@ -30,7 +30,7 @@ type ( HttpServer struct { stdServer *http.Server router Router - groups []Group + groups []*xGroup Modules []*HttpModule DotApp *DotWeb Validator Validator