Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions dotweb.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
Expand Down
9 changes: 9 additions & 0 deletions group.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
)

Expand Down Expand Up @@ -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
}
8 changes: 8 additions & 0 deletions router.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand Down
2 changes: 1 addition & 1 deletion server.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ type (
HttpServer struct {
stdServer *http.Server
router Router
groups []Group
groups []*xGroup
Modules []*HttpModule
DotApp *DotWeb
Validator Validator
Expand Down