From fbb571de0151d4925ed4309aebe803957eddd1b5 Mon Sep 17 00:00:00 2001 From: Alexandre Terrasa Date: Mon, 23 May 2016 16:52:12 -0400 Subject: [PATCH] lib/popcorn: introduce Router::use_after service So the user can force some middlewares to be called after the other handlers. Signed-off-by: Alexandre Terrasa --- lib/popcorn/pop_handlers.nit | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/lib/popcorn/pop_handlers.nit b/lib/popcorn/pop_handlers.nit index 897b3ba..1c20b67 100644 --- a/lib/popcorn/pop_handlers.nit +++ b/lib/popcorn/pop_handlers.nit @@ -310,6 +310,9 @@ class Router # 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. @@ -326,10 +329,20 @@ class Router 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 @@ -344,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) -- 1.7.9.5