X-Git-Url: http://nitlanguage.org diff --git a/lib/popcorn/pop_handlers.nit b/lib/popcorn/pop_handlers.nit index 2f438ef..1c20b67 100644 --- a/lib/popcorn/pop_handlers.nit +++ b/lib/popcorn/pop_handlers.nit @@ -307,6 +307,12 @@ class Router # List of handlers to match with requests. private var handlers = new Map[AppRoute, Handler] + # List of handlers to match before every other. + private var pre_handlers = new Map[AppRoute, Handler] + + # List of handlers to match after every other. + private var post_handlers = new Map[AppRoute, Handler] + # Register a `handler` for a route `path`. # # Route paths are matched in registration order. @@ -315,9 +321,33 @@ class Router handlers[route] = handler end + # Register a pre-handler for a route `path`. + # + # Prehandlers are matched before every other handlers in registrastion order. + fun use_before(path: String, handler: Handler) do + var route = build_route(handler, path) + pre_handlers[route] = handler + end + + # Register a post-handler for a route `path`. + # + # Posthandlers are matched after every other handlers in registrastion order. + fun use_after(path: String, handler: Handler) do + var route = build_route(handler, path) + post_handlers[route] = handler + end + redef fun handle(route, uri, req, res) do if not route.match(uri) then return + handle_pre(route, uri, req, res) handle_in(route, uri, req, res) + handle_post(route, uri, req, res) + end + + private fun handle_pre(route: AppRoute, uri: String, req: HttpRequest, res: HttpResponse) do + for hroute, handler in pre_handlers do + handler.handle(hroute, route.uri_root(uri), req, res) + end end private fun handle_in(route: AppRoute, uri: String, req: HttpRequest, res: HttpResponse) do @@ -327,6 +357,12 @@ class Router end end + private fun handle_post(route: AppRoute, uri: String, req: HttpRequest, res: HttpResponse) do + for hroute, handler in post_handlers do + handler.handle(hroute, route.uri_root(uri), req, res) + end + end + private fun build_route(handler: Handler, path: String): AppRoute do if handler isa Router or handler isa StaticHandler then return new AppGlobRoute(path)