diff --git a/router.go b/router.go index bcc739c0..7b25655b 100644 --- a/router.go +++ b/router.go @@ -338,7 +338,6 @@ func (app *App) register(methods []string, pathRaw string, group *Group, handler if pathRaw[0] != '/' { pathRaw = "/" + pathRaw } - pathPretty := pathRaw if !app.config.CaseSensitive { pathPretty = utils.ToLower(pathPretty) @@ -346,10 +345,11 @@ func (app *App) register(methods []string, pathRaw string, group *Group, handler if !app.config.StrictRouting && len(pathPretty) > 1 { pathPretty = utils.TrimRight(pathPretty, '/') } - pathClean := RemoveEscapeChar(pathPretty) + parsedRaw := parseRoute(pathRaw, app.customConstraints...) parsedPretty := parseRoute(pathPretty, app.customConstraints...) + isMount := group != nil && group.app != app for _, method := range methods { @@ -457,32 +457,28 @@ func (app *App) deleteRoute(methods []string, matchFunc func(r *Route) bool) { continue // Skip invalid HTTP methods } - for i, route := range app.stack[m] { - if matchFunc(route) { - // Remove route from stack - if i+1 < len(app.stack[m]) { - fmt.Println("a") - app.stack[m] = append(app.stack[m][:i], app.stack[m][i+1:]...) - } else { - fmt.Println("b") - app.stack[m] = app.stack[m][:i] - } - app.routesRefreshed = true - - // Decrement global handler count. In middleware routes, only decrement once - if _, ok := removedUseRoutes[route.path]; (route.use && slices.Equal(methods, app.config.RequestMethods) && !ok) || !route.use { - if route.use { - removedUseRoutes[route.path] = struct{}{} - } - atomic.AddUint32(&app.handlersCount, ^uint32(len(route.Handlers)-1)) //nolint:gosec // Not a concern - } - - // Decrement global route count - atomic.AddUint32(&app.routesCount, ^uint32(0)) //nolint:gosec // Not a concern1 + for i := len(app.stack[m]) - 1; i >= 0; i-- { + route := app.stack[m][i] + if !matchFunc(route) { + continue // Skip if route does not match } + + app.stack[m] = append(app.stack[m][:i], app.stack[m][i+1:]...) + app.routesRefreshed = true + + // Decrement global handler count. In middleware routes, only decrement once + if _, ok := removedUseRoutes[route.path]; (route.use && slices.Equal(methods, app.config.RequestMethods) && !ok) || !route.use { + if route.use { + removedUseRoutes[route.path] = struct{}{} + } + + atomic.AddUint32(&app.handlersCount, ^uint32(len(route.Handlers)-1)) //nolint:gosec // Not a concern + } + + // Decrement global route count + atomic.AddUint32(&app.routesCount, ^uint32(0)) //nolint:gosec // Not a concern1 } } - } func (app *App) addRoute(method string, route *Route, isMounted ...bool) { diff --git a/router_test.go b/router_test.go index 246aebc1..780fc345 100644 --- a/router_test.go +++ b/router_test.go @@ -813,10 +813,15 @@ func TestRemoveRoute(t *testing.T) { app.RemoveRoute("/test", MethodGet) app.RebuildTree() - routes := app.GetRoutes() - for _, route := range routes { - fmt.Printf("%s %s\n", route.Method, route.Path) - } + req, err = http.NewRequest(MethodGet, "/test", nil) + require.NoError(t, err) + + resp, err = app.Test(req) + require.NoError(t, err) + + buf.Reset() + + require.Equal(t, StatusMethodNotAllowed, resp.StatusCode) require.Equal(t, uint32(4), app.handlersCount) require.Equal(t, uint32(19), app.routesCount) @@ -837,7 +842,7 @@ func TestRemoveRoute(t *testing.T) { fmt.Println(string(body)) require.Equal(t, 404, resp.StatusCode) - require.Equal(t, "13", buf.String()) + require.Equal(t, "1", buf.String()) buf.Reset() @@ -848,14 +853,14 @@ func TestRemoveRoute(t *testing.T) { require.NoError(t, err) require.Equal(t, 404, resp.StatusCode) - require.Equal(t, "13", buf.String()) + require.Equal(t, "1", buf.String()) buf.Reset() app.RemoveRoute("/", MethodGet, MethodPost) require.Equal(t, uint32(2), app.handlersCount) - require.Equal(t, uint32(18), app.routesCount) + require.Equal(t, uint32(14), app.routesCount) req, err = http.NewRequest(MethodGet, "/", nil) require.NoError(t, err) @@ -864,14 +869,19 @@ func TestRemoveRoute(t *testing.T) { require.NoError(t, err) require.Equal(t, 404, resp.StatusCode) - require.Equal(t, "1", buf.String()) + require.Equal(t, "", buf.String()) + + buf.Reset() app.RemoveRoute("/test", MethodGet, MethodPost) require.Equal(t, uint32(2), app.handlersCount) - require.Equal(t, uint32(16), app.routesCount) + require.Equal(t, uint32(14), app.routesCount) app.RemoveRoute("/test", app.config.RequestMethods...) + + require.Equal(t, uint32(1), app.handlersCount) + require.Equal(t, uint32(7), app.routesCount) } //////////////////////////////////////////////