lib/popcorn: introduce Router::use_before service
authorAlexandre Terrasa <alexandre@moz-code.org>
Mon, 23 May 2016 20:51:55 +0000 (16:51 -0400)
committerAlexandre Terrasa <alexandre@moz-code.org>
Wed, 25 May 2016 03:37:13 +0000 (23:37 -0400)
So the user can force some middlewares to be called before the other handlers.

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

lib/popcorn/pop_handlers.nit

index 2f438ef..897b3ba 100644 (file)
@@ -307,6 +307,9 @@ 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]
+
        # Register a `handler` for a route `path`.
        #
        # Route paths are matched in registration order.
@@ -315,9 +318,23 @@ 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
+
        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)
+
+       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