From acbef8527c647d4fbe62839b9b516fc9c6080a50 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sun, 22 Apr 2018 22:50:17 +0300 Subject: [PATCH] ring/routes, fix async default handling --- modules/reitit-ring/src/reitit/ring.cljc | 18 +++++++++++++++++- test/cljc/reitit/ring_test.cljc | 6 +++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/modules/reitit-ring/src/reitit/ring.cljc b/modules/reitit-ring/src/reitit/ring.cljc index 558ff732..52da7a09 100644 --- a/modules/reitit-ring/src/reitit/ring.cljc +++ b/modules/reitit-ring/src/reitit/ring.cljc @@ -15,6 +15,22 @@ [top (assoc childs k v)] [(assoc top k v) childs])) [{} {}] data)) +(defn routes + "Create a ring handler by combining several handlers into one." + [& handlers] + (let [single-arity (apply some-fn handlers)] + (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)))))) + (defn create-default-handler "A default ring handler that can handle the following cases, configured via options: @@ -81,7 +97,7 @@ (impl/fast-assoc :path-params path-params) (impl/fast-assoc ::r/match match) (impl/fast-assoc ::r/router router))] - (handler request respond raise)) + ((routes handler default-handler) request respond raise)) (default-handler request respond raise)))) {::r/router router})))) diff --git a/test/cljc/reitit/ring_test.cljc b/test/cljc/reitit/ring_test.cljc index 83c688ef..8ab6273d 100644 --- a/test/cljc/reitit/ring_test.cljc +++ b/test/cljc/reitit/ring_test.cljc @@ -17,7 +17,7 @@ (defn handler ([{:keys [::mw]}] {:status 200 :body (conj mw :ok)}) - ([request respond raise] + ([request respond _] (respond (handler request)))) (deftest ring-router-test @@ -227,11 +227,11 @@ (app {:request-method :post, :uri "/ping"} respond raise) (is (= 405 (:status (respond)))) (is (= ::nil (raise))))) - (testing "if handler rejects, nil in still returned." + (testing "if handler rejects" (let [respond (promise) raise (promise)] (app {:request-method :get, :uri "/pong"} respond raise) - (is (= nil (respond))) + (is (= 406 (:status (respond)))) (is (= ::nil (raise)))))))))) (deftest middleware-transform-test