fix removing logic

This commit is contained in:
Muhammed Efe Cetin 2025-05-16 00:01:53 +03:00
parent 8fca96d718
commit 9c10d0d99e
No known key found for this signature in database
GPG Key ID: 0AA4D45CBAA86F73
2 changed files with 40 additions and 34 deletions

View File

@ -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) {

View File

@ -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)
}
//////////////////////////////////////////////