Merge pull request #693 from bsless/faster-routes

Speed up routes and inline it in code ring handler
This commit is contained in:
Tommi Reiman 2024-08-27 13:58:57 +03:00 committed by GitHub
commit 517ae8ffc3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

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- 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 (defn routes
"Create a ring handler by combining several handlers into one." "Create a ring handler by combining several handlers into one."
[& handlers] {:arglists '([& handlers])}
(if-let [single-arity (some->> handlers (keep identity) (seq) (apply some-fn))] ([] nil)
(fn ([handler] handler)
([request] ([handler1 handler2]
(single-arity request)) (cond
([request respond raise] (and handler1 handler2) (comp-handlers handler1 handler2)
(letfn [(f [handlers] handler1 handler1
(if (seq handlers) handler2 handler2
(let [handler (first handlers) :else nil))
respond' #(if % (respond %) (f (rest handlers)))] ([handler1 handler2 & handlers]
(handler request respond' raise)) (reduce routes (routes handler1 handler2) handlers)))
(respond nil)))]
(f 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
@ -363,7 +380,10 @@
result (:result match) result (:result match)
handler (-> result method :handler (or default-handler)) handler (-> result method :handler (or default-handler))
request (enrich-request request path-params match router)] 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)) (default-handler (enrich-default-request request router) respond raise))
nil))) nil)))
{::r/router router})))) {::r/router router}))))