diff --git a/HISTORY.md b/HISTORY.md index fb75e10a..191f37bf 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -28,7 +28,8 @@ The codebase for Dependency Injection, Internationalization and localization and ## Fixes and Improvements -- Add the new `Party.UseOnce` method to the `*Route` too and a new `*Route.RemoveMiddleware(interface{})` method was added in order to remove a specific middleware from a specific Route. Example: +- Add the new `Party.UseOnce` method to the `*Route` +- Add a new `*Route.RemoveHandler(interface{}) int`, deletes a handler from begin, main and done handlers based on its name or the handler pc function. Returns the total amount of handlers removed. ```go func middleware(ctx iris.Context) { @@ -45,7 +46,7 @@ func main() { app.Get("/", index) // Handlers = other - app.Get("/other", other).RemoveMiddleware(middleware) + app.Get("/other", other).RemoveHandler(middleware) } ``` diff --git a/core/router/route.go b/core/router/route.go index b3b627ff..7b0ee433 100644 --- a/core/router/route.go +++ b/core/router/route.go @@ -145,10 +145,12 @@ func (r *Route) UseOnce(handlers ...context.Handler) { r.beginHandlers = context.UpsertHandlers(r.beginHandlers, handlers) } -// RemoveMiddleware deletes a begin handler based on its -// name or the handler pc function. +// RemoveHandler deletes a handler from begin, main and done handlers +// based on its name or the handler pc function. +// Returns the total amount of handlers removed. +// // Should be called before Application Build. -func (r *Route) RemoveMiddleware(nameOrHandler interface{}) { +func (r *Route) RemoveHandler(nameOrHandler interface{}) (count int) { handlerName := "" switch h := nameOrHandler.(type) { case string: @@ -156,19 +158,34 @@ func (r *Route) RemoveMiddleware(nameOrHandler interface{}) { case context.Handler: handlerName = context.HandlerName(h) default: - panic(fmt.Sprintf("remove begin handler: unexpected type of %T", h)) + panic(fmt.Sprintf("remove handler: unexpected type of %T", h)) } - var newHandlers context.Handlers - for _, h := range r.beginHandlers { + r.beginHandlers = removeHandler(handlerName, r.beginHandlers, &count) + r.Handlers = removeHandler(handlerName, r.Handlers, &count) + r.doneHandlers = removeHandler(handlerName, r.doneHandlers, &count) + + return +} + +func removeHandler(handlerName string, handlers context.Handlers, counter *int) (newHandlers context.Handlers) { + for _, h := range handlers { + if h == nil { + continue + } + if context.HandlerName(h) == handlerName { + if counter != nil { + *counter++ + } + continue } newHandlers = append(newHandlers, h) } - r.beginHandlers = newHandlers + return } // Done adds explicit finish handlers to this route.