Speed up routes code path

Fixes #692
This commit is contained in:
Ben Sless 2024-08-25 16:20:28 +03:00
parent a0467d52cd
commit c48b6a3704

View file

@ -133,21 +133,38 @@
" Use :reitit.ring/default-options-endpoint instead."))) " Use :reitit.ring/default-options-endpoint instead.")))
(r/router data opts)))) (r/router data opts))))
(defn routes (defn- comp-handlers
"Create a ring handler by combining several handlers into one." "Compose two ring handlers such that if the first has an empty response
[& handlers] the second will be invoked."
(if-let [single-arity (some->> handlers (keep identity) (seq) (apply some-fn))] ([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 (fn
([request] ([request]
(single-arity request)) (single-arity request))
([request respond raise] ([request respond raise]
(letfn [(f [handlers] (multi-arity request respond raise))))))
(if (seq handlers)
(let [handler (first handlers) (defn routes
respond' #(if % (respond %) (f (rest handlers)))] "Create a ring handler by combining several handlers into one."
(handler request respond' raise)) {:arglists '([& handlers])}
(respond nil)))] ([] nil)
(f handlers)))))) ([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 (defn redirect-trailing-slash-handler
"A ring handler that redirects a missing path if there is an "A ring handler that redirects a missing path if there is an