From a0467d52cdd3bd173dd8ed2fb0ef17d8644862d7 Mon Sep 17 00:00:00 2001 From: Ben Sless Date: Sun, 25 Aug 2024 16:20:15 +0300 Subject: [PATCH 1/2] Inline call to routes --- modules/reitit-ring/src/reitit/ring.cljc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/reitit-ring/src/reitit/ring.cljc b/modules/reitit-ring/src/reitit/ring.cljc index e7c3c138..2f0c0be2 100644 --- a/modules/reitit-ring/src/reitit/ring.cljc +++ b/modules/reitit-ring/src/reitit/ring.cljc @@ -363,7 +363,10 @@ result (:result match) handler (-> result method :handler (or default-handler)) request (enrich-request request path-params match router)] - ((routes handler default-handler) request respond raise)) + (handler request (fn [response] + (if response + (respond response) + (default-handler request respond raise))) raise)) (default-handler (enrich-default-request request router) respond raise)) nil))) {::r/router router})))) From c48b6a37043bd69414dd07bba3ac08e892d9dcd6 Mon Sep 17 00:00:00 2001 From: Ben Sless Date: Sun, 25 Aug 2024 16:20:28 +0300 Subject: [PATCH 2/2] Speed up routes code path Fixes #692 --- modules/reitit-ring/src/reitit/ring.cljc | 43 +++++++++++++++++------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/modules/reitit-ring/src/reitit/ring.cljc b/modules/reitit-ring/src/reitit/ring.cljc index 2f0c0be2..40259ed2 100644 --- a/modules/reitit-ring/src/reitit/ring.cljc +++ b/modules/reitit-ring/src/reitit/ring.cljc @@ -133,21 +133,38 @@ " Use :reitit.ring/default-options-endpoint instead."))) (r/router data opts)))) +(defn- comp-handlers + "Compose two ring handlers such that if the first has an empty response + the second will be invoked." + ([handler] + handler) + ([handler1 handler2] + (let [single-arity (fn [request] + (or (handler1 request) (handler2 request))) + multi-arity (fn [request respond raise] + (handler1 request (fn [response] + (if response + (respond response) + (handler2 request respond raise))) raise))] + (fn + ([request] + (single-arity request)) + ([request respond raise] + (multi-arity request respond raise)))))) + (defn routes "Create a ring handler by combining several handlers into one." - [& handlers] - (if-let [single-arity (some->> handlers (keep identity) (seq) (apply some-fn))] - (fn - ([request] - (single-arity request)) - ([request respond raise] - (letfn [(f [handlers] - (if (seq handlers) - (let [handler (first handlers) - respond' #(if % (respond %) (f (rest handlers)))] - (handler request respond' raise)) - (respond nil)))] - (f handlers)))))) + {:arglists '([& handlers])} + ([] nil) + ([handler] handler) + ([handler1 handler2] + (cond + (and handler1 handler2) (comp-handlers handler1 handler2) + handler1 handler1 + handler2 handler2 + :else nil)) + ([handler1 handler2 & handlers] + (reduce routes (routes handler1 handler2) handlers))) (defn redirect-trailing-slash-handler "A ring handler that redirects a missing path if there is an