From 7e9ea8f905f0c438df7223bee9bbe6861e2c0d41 Mon Sep 17 00:00:00 2001 From: Juho Teperi Date: Tue, 24 Jul 2018 11:45:06 +0300 Subject: [PATCH 01/55] Don't options using default values --- examples/frontend-controllers/src/frontend/core.cljs | 3 +-- examples/frontend/src/frontend/core.cljs | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/examples/frontend-controllers/src/frontend/core.cljs b/examples/frontend-controllers/src/frontend/core.cljs index 64b0382d..6ff8e78d 100644 --- a/examples/frontend-controllers/src/frontend/core.cljs +++ b/examples/frontend-controllers/src/frontend/core.cljs @@ -84,8 +84,7 @@ (swap! match (fn [old-match] (if new-match (assoc new-match :controllers (rfc/apply-controllers (:controllers old-match) new-match)))))) - {:use-fragment true - :path-prefix "/"}) + {:use-fragment true}) (r/render [current-page] (.getElementById js/document "app"))) (init!) diff --git a/examples/frontend/src/frontend/core.cljs b/examples/frontend/src/frontend/core.cljs index 95fed0e8..3acd0df7 100644 --- a/examples/frontend/src/frontend/core.cljs +++ b/examples/frontend/src/frontend/core.cljs @@ -62,8 +62,7 @@ (defn init! [] (rfe/start! routes (fn [m] (reset! match m)) - {:use-fragment true - :path-prefix "/"}) + {:use-fragment true}) (r/render [current-page] (.getElementById js/document "app"))) (init!) From 9d787ef81a5319bd628e253d9ced4d0f1c4e495a Mon Sep 17 00:00:00 2001 From: Juho Teperi Date: Tue, 24 Jul 2018 11:45:22 +0300 Subject: [PATCH 02/55] Add example button using set-token --- examples/frontend/src/frontend/core.cljs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/examples/frontend/src/frontend/core.cljs b/examples/frontend/src/frontend/core.cljs index 3acd0df7..1f398653 100644 --- a/examples/frontend/src/frontend/core.cljs +++ b/examples/frontend/src/frontend/core.cljs @@ -10,7 +10,11 @@ (defn home-page [] [:div - [:h2 "Welcome to frontend"]]) + [:h2 "Welcome to frontend"] + [:button + {:type "button" + :on-click #(rfe/set-token ::item {:id 3})} + "Item 3"]]) (defn about-page [] [:div From d54c05426ccf089a81b2842675eb640ca66955ea Mon Sep 17 00:00:00 2001 From: Juho Teperi Date: Tue, 24 Jul 2018 11:45:51 +0300 Subject: [PATCH 03/55] Share router between history tests --- test/cljs/reitit/frontend/history_test.cljs | 24 +++++++-------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/test/cljs/reitit/frontend/history_test.cljs b/test/cljs/reitit/frontend/history_test.cljs index 3185b611..36eb8cf2 100644 --- a/test/cljs/reitit/frontend/history_test.cljs +++ b/test/cljs/reitit/frontend/history_test.cljs @@ -1,21 +1,20 @@ (ns reitit.frontend.history-test (:require [clojure.test :refer [deftest testing is are]] [reitit.core :as r] + [reitit.frontend :as rf] [reitit.frontend.history :as rfh] [reitit.frontend.test-utils :refer [capture-console]])) (def browser (exists? js/window)) +(def router (r/router ["/" + ["" ::frontpage] + ["foo" ::foo] + ["bar/:id" ::bar]])) + (deftest fragment-history-test (when browser - (let [router (r/router ["/" - ["" ::frontpage] - ["foo" ::foo] - ["bar/:id" ::bar]]) - history (rfh/start! router - (fn [_]) - {:use-fragment true - :path-prefix "/"})] + (let [history (rfh/start! router (fn [_]) {:use-fragment true})] (testing "creating urls" (is (= "#/foo" @@ -34,14 +33,7 @@ (deftest html5-history-test (when browser - (let [router (r/router ["/" - ["" ::frontpage] - ["foo" ::foo] - ["bar/:id" ::bar]]) - history (rfh/start! router - (fn [_]) - {:use-fragment false - :path-prefix "/"})] + (let [history (rfh/start! router (fn [_]) {:use-fragment false})] (testing "creating urls" (is (= "/foo" From 08156f6a6dfcb409c1a20224e750d5459f1d4d74 Mon Sep 17 00:00:00 2001 From: Juho Teperi Date: Tue, 24 Jul 2018 13:52:09 +0300 Subject: [PATCH 04/55] Replace Closure Html5History - Create History protocol and two implementations: FragmentHistory and Html5History - API follows now Html5 history, i.e. push-state and replace-state - path-prefix is removed --- examples/frontend/src/frontend/core.cljs | 10 +- .../src/reitit/frontend/easy.cljs | 33 ++- .../src/reitit/frontend/history.cljs | 267 +++++++++--------- test/cljs/reitit/frontend/history_test.cljs | 86 +++++- 4 files changed, 249 insertions(+), 147 deletions(-) diff --git a/examples/frontend/src/frontend/core.cljs b/examples/frontend/src/frontend/core.cljs index 1f398653..b536e575 100644 --- a/examples/frontend/src/frontend/core.cljs +++ b/examples/frontend/src/frontend/core.cljs @@ -11,10 +11,16 @@ (defn home-page [] [:div [:h2 "Welcome to frontend"] + [:button {:type "button" - :on-click #(rfe/set-token ::item {:id 3})} - "Item 3"]]) + :on-click #(rfe/push-state ::item {:id 3})} + "Item 3"] + + [:button + {:type "button" + :on-click #(rfe/replace-state ::item {:id 4})} + "Replace State Item 4"] ]) (defn about-page [] [:div diff --git a/modules/reitit-frontend/src/reitit/frontend/easy.cljs b/modules/reitit-frontend/src/reitit/frontend/easy.cljs index 1a87e43e..6f812293 100644 --- a/modules/reitit-frontend/src/reitit/frontend/easy.cljs +++ b/modules/reitit-frontend/src/reitit/frontend/easy.cljs @@ -6,7 +6,20 @@ (defonce history (atom nil)) +;; Doc-strings from reitit.frontend.history +;; remember to update both! + (defn start! + "This registers event listeners on HTML5 history and hashchange events. + When using with development workflow like Figwheel, rememeber to + remove listeners using stop! call before calling start! again. + + Parameters: + - router The Reitit routing tree. + - on-navigate Function to be called when route changes. Takes two parameters, ´token´ and ´history´ object. + + Options: + - :use-fragment (default true) If true, onhashchange and location hash are used to store the token." [routes on-navigate opts] (swap! history (fn [old-history] (rfh/stop! old-history) @@ -14,26 +27,26 @@ (defn href ([k] - (rfh/href @history k)) + (rfh/href @history k nil nil)) ([k params] - (rfh/href @history k params)) + (rfh/href @history k params nil)) ([k params query] (rfh/href @history k params query))) -(defn set-token +(defn push-state "Sets the new route, leaving previous route in history." ([k] - (rfh/set-token @history k)) + (rfh/push-state @history k nil nil)) ([k params] - (rfh/set-token @history k params)) + (rfh/push-state @history k params nil)) ([k params query] - (rfh/set-token @history k params query))) + (rfh/push-state @history k params query))) -(defn replace-token +(defn replace-state "Replaces current route. I.e. current route is not left on history." ([k] - (rfh/replace-token @history k)) + (rfh/replace-state @history k nil nil)) ([k params] - (rfh/replace-token @history k params)) + (rfh/replace-state @history k params nil)) ([k params query] - (rfh/replace-token @history k params query))) + (rfh/replace-state @history k params query))) diff --git a/modules/reitit-frontend/src/reitit/frontend/history.cljs b/modules/reitit-frontend/src/reitit/frontend/history.cljs index 5a10250e..42ce16db 100644 --- a/modules/reitit-frontend/src/reitit/frontend/history.cljs +++ b/modules/reitit-frontend/src/reitit/frontend/history.cljs @@ -6,154 +6,159 @@ [goog.dom :as dom] [reitit.core :as r] [reitit.frontend :as rf] - [reitit.impl :as impl]) - (:import goog.history.Html5History - goog.Uri)) + [reitit.impl :as impl] + [goog.events :as gevents]) + (:import goog.Uri)) -;; Token is for Closure HtmlHistory -;; Path is for reitit +(defprotocol History + (-init [this] "Create event listeners") + (-stop [this] "Remove event listeners") + (-on-navigate [this path]) + (-get-path [this]) + (-href [this path])) -(defn- token->path [history token] - (if (.-useFragment_ history) - ;; If no fragment at all, default to "/" - ;; If fragment is present, the token already is prefixed with "/" - (if (= "" token) - (.getPathPrefix history) - token) - (str (.getPathPrefix history) token))) +;; This version listens for both pop-state and hash-change for +;; compatibility for old browsers not supporting History API. +(defrecord FragmentHistory [on-navigate router listen-key last-fragment] + History + (-init [this] + ;; Link clicks and e.g. back button trigger both events, if fragment is same as previous ignore second event. + ;; For old browsers only the hash-change event is triggered. + (let [last-fragment (atom nil) + this (assoc this :last-fragment last-fragment) + handler (fn [e] + (let [path (-get-path this)] + (when (or (= goog.events.EventType.POPSTATE (.-type e)) + (not= @last-fragment path)) + (-on-navigate this path))))] + (-on-navigate this (-get-path this)) + (assoc this + :listen-key (gevents/listen js/window + #js [goog.events.EventType.POPSTATE goog.events.EventType.HASHCHANGE] + handler + false)))) + (-stop [this] + (gevents/unlistenByKey listen-key)) + (-on-navigate [this path] + (reset! last-fragment path) + (on-navigate (rf/match-by-path router path) this)) + (-get-path [this] + ;; Remove # + ;; "" or "#" should be same as "#/" + (let [fragment (subs (.. js/window -location -hash) 1)] + (if (= "" fragment) + "/" + fragment))) + (-href [this path] + (if path + (str "#" path)))) -(defn- path->token [history path] - (subs path (if (.-useFragment_ history) - 1 - (count (.getPathPrefix history))))) +(defrecord Html5History [on-navigate router listen-key click-listen-key] + History + (-init [this] + (let [handler + (fn [e] + (-on-navigate this (-get-path this))) -(defn- token->href [history token] - (if token - (str (if (.-useFragment_ history) - (str "#")) - (.getPathPrefix history) - token))) + current-domain + (if (exists? js/location) + (.getDomain (.parse Uri js/location))) -(def ^:private current-domain (if (exists? js/location) - (.getDomain (.parse Uri js/location)))) - -(defn ignore-anchor-click - "Ignore click events from a elements, if the href points to URL that is part - of the routing tree." - [router history e] - ;; Returns the next matching anchestor of event target - (when-let [el (.closest (.-target e) "a")] - (let [uri (.parse Uri (.-href el))] - (when (and (or (and (not (.hasScheme uri)) (not (.hasDomain uri))) - (= current-domain (.getDomain uri))) - (not (.-altKey e)) - (not (.-ctrlKey e)) - (not (.-metaKey e)) - (not (.-shiftKey e)) - (not (contains? #{"_blank" "self"} (.getAttribute el "target"))) - ;; Left button - (= 0 (.-button e)) - (reitit/match-by-path router (.getPath uri))) - (.preventDefault e) - (.setToken history (path->token history (str (.getPath uri) - (if (seq (.getQuery uri)) - (str "?" (.getQuery uri)))))))))) - -(impl/goog-extend - ^{:jsdoc ["@constructor" - "@extends {Html5History.TokenTransformer}"]} - TokenTransformer - Html5History.TokenTransformer - ([] - (this-as this - (.call Html5History.TokenTransformer this))) - (retrieveToken [path-prefix location] - (subs (.-pathname location) (count path-prefix))) - (createUrl [token path-prefix location] - ;; Code in Closure also adds current query params - ;; from location. - (str path-prefix token))) + ;; Prevent document load when clicking a elements, if the href points to URL that is part + ;; of the routing tree." + ignore-anchor-click + (fn ignore-anchor-click + [e] + ;; Returns the next matching anchestor of event target + (when-let [el (.closest (.-target e) "a")] + (let [uri (.parse Uri (.-href el))] + (when (and (or (and (not (.hasScheme uri)) (not (.hasDomain uri))) + (= current-domain (.getDomain uri))) + (not (.-altKey e)) + (not (.-ctrlKey e)) + (not (.-metaKey e)) + (not (.-shiftKey e)) + (not (contains? #{"_blank" "self"} (.getAttribute el "target"))) + ;; Left button + (= 0 (.-button e)) + (reitit/match-by-path router (.getPath uri))) + (.preventDefault e) + (let [path (str (.getPath uri) + (if (seq (.getQuery uri)) + (str "?" (.getQuery uri))))] + (.pushState js/window.history nil "" path) + (-on-navigate this path))))))] + (-on-navigate this (-get-path this)) + (assoc this + :listen-key (gevents/listen js/window goog.events.EventType.POPSTATE handler false) + :click-listen-key (e/listen js/document e/EventType.CLICK ignore-anchor-click)))) + (-on-navigate [this path] + (on-navigate (rf/match-by-path router path) this)) + (-stop [this] + (gevents/unlistenByKey listen-key) + (gevents/unlistenByKey click-listen-key)) + (-get-path [this] + (.. js/window -location -pathname)) + (-href [this path] + path)) (defn start! - "This registers event listeners on either haschange or HTML5 history. + "This registers event listeners on HTML5 history and hashchange events. When using with development workflow like Figwheel, rememeber to remove listeners using stop! call before calling start! again. Parameters: - - router The reitit routing tree. - - on-navigate Function to be called when route changes. + - router The Reitit routing tree. + - on-navigate Function to be called when route changes. Takes two parameters, ´match´ and ´history´ object. Options: - - :use-fragment (default true) If true, onhashchange and location hash are used to store the token. - - :path-prefix (default \"/\") If :use-fragment is false, this is prepended to all tokens, and is - removed from start of the token before matching the route." - [router - on-navigate - {:keys [path-prefix use-fragment] - :or {path-prefix "/" - use-fragment true}}] - (let [history - (doto (Html5History. nil (TokenTransformer.)) - (.setEnabled true) - (.setPathPrefix path-prefix) - (.setUseFragment use-fragment)) + - :use-fragment (default true) If true, onhashchange and location hash are used to store current route." + ([router on-navigate] + (start! router on-navigate nil)) + ([router + on-navigate + {:keys [use-fragment] + :or {use-fragment true}}] + (let [opts {:router router + :on-navigate on-navigate}] + (-init (if use-fragment + (map->FragmentHistory opts) + (map->Html5History opts)))))) - event-key - (e/listen history goog.history.EventType.NAVIGATE - (fn [e] - (on-navigate (rf/match-by-path router (token->path history (.getToken history)))))) - - click-listen-key - (if-not use-fragment - (e/listen js/document e/EventType.CLICK - (partial ignore-anchor-click router history)))] - - ;; Trigger navigate event for current route - (on-navigate (rf/match-by-path router (token->path history (.getToken history)))) - - {:router router - :history history - :close-fn (fn [] - (e/unlistenByKey event-key) - (e/unlistenByKey click-listen-key) - (.dispose history))})) - -(defn stop! [{:keys [close-fn]}] - (if close-fn - (close-fn))) - -(defn- match->token [history match k params query] - (some->> (r/match->path match query) - (path->token history))) +(defn stop! [history] + (if history + (-stop history))) (defn href - ([state k] - (href state k nil)) - ([state k params] - (href state k params nil)) - ([{:keys [router history]} k params query] - (let [match (rf/match-by-name! router k params) - token (match->token history match k params query)] - (token->href history token)))) + ([history k] + (href history k nil)) + ([history k params] + (href history k params nil)) + ([history k params query] + (let [match (rf/match-by-name! (:router history) k params)] + (-href history (r/match->path match query))))) -(defn set-token +(defn push-state "Sets the new route, leaving previous route in history." - ([state k] - (set-token state k nil)) - ([state k params] - (set-token state k params nil)) - ([{:keys [router history]} k params query] - (let [match (rf/match-by-name! router k params) - token (match->token history match k params query)] - (.setToken history token)))) + ([history k] + (push-state history k nil nil)) + ([history k params] + (push-state history k params nil)) + ([history k params query] + (let [match (rf/match-by-name! (:router history) k params) + path (r/match->path match query)] + ;; pushState and replaceState don't trigger popstate event so call on-navigate manually + (.pushState js/window.history nil "" (-href history path)) + (-on-navigate history path)))) -(defn replace-token +(defn replace-state "Replaces current route. I.e. current route is not left on history." - ([state k] - (replace-token state k nil)) - ([state k params] - (replace-token state k params nil)) - ([{:keys [router history]} k params query] - (let [match (rf/match-by-name! router k params) - token (match->token history match k params query)] - (.replaceToken history token)))) + ([history k] + (replace-state history k nil nil)) + ([history k params] + (replace-state history k params nil)) + ([history k params query] + (let [match (rf/match-by-name! (:router history) k params) + path (r/match->path match query)] + (.replaceState js/window.history nil "" (-href history path)) + (-on-navigate history path)))) diff --git a/test/cljs/reitit/frontend/history_test.cljs b/test/cljs/reitit/frontend/history_test.cljs index 36eb8cf2..81878d45 100644 --- a/test/cljs/reitit/frontend/history_test.cljs +++ b/test/cljs/reitit/frontend/history_test.cljs @@ -1,9 +1,10 @@ (ns reitit.frontend.history-test - (:require [clojure.test :refer [deftest testing is are]] + (:require [clojure.test :refer [deftest testing is are async]] [reitit.core :as r] [reitit.frontend :as rf] [reitit.frontend.history :as rfh] - [reitit.frontend.test-utils :refer [capture-console]])) + [reitit.frontend.test-utils :refer [capture-console]] + [goog.events :as gevents])) (def browser (exists? js/window)) @@ -14,6 +15,9 @@ (deftest fragment-history-test (when browser + (gevents/removeAll js/window goog.events.EventType.POPSTATE) + (gevents/removeAll js/window goog.events.EventType.HASHCHANGE) + (let [history (rfh/start! router (fn [_]) {:use-fragment true})] (testing "creating urls" @@ -29,10 +33,48 @@ (is (= nil value)) (is (= [{:type :warn :message ["missing route" ::asd]}] - messages))))))) + messages)))) + + (rfh/stop! history)))) + +(deftest fragment-history-routing-test + (when browser + (gevents/removeAll js/window goog.events.EventType.POPSTATE) + (gevents/removeAll js/window goog.events.EventType.HASHCHANGE) + + (async done + (let [n (atom 0) + history (rfh/start! router + (fn [match history] + (let [url (rfh/-get-path history)] + (case (swap! n inc) + 1 (do (is (= "/" url) + "start at root") + (rfh/push-state history ::foo)) + 2 (do (is (= "/foo" url) + "push-state") + (.back js/window.history)) + 3 (do (is (= "/" url) + "go back") + (rfh/push-state history ::bar {:id 1})) + 4 (do (is (= "/bar/1" url) + "push-state 2") + (rfh/replace-state history ::bar {:id 2})) + 5 (do (is (= "/bar/2" url) + "replace-state") + (.back js/window.history)) + 6 (do (is (= "/" url) + "go back after replace state") + (rfh/stop! history) + (done)) + (do (is false "extra event"))))) + {:use-fragment true})])))) (deftest html5-history-test (when browser + (gevents/removeAll js/window goog.events.EventType.POPSTATE) + (gevents/removeAll js/window goog.events.EventType.HASHCHANGE) + (let [history (rfh/start! router (fn [_]) {:use-fragment false})] (testing "creating urls" @@ -48,4 +90,40 @@ (is (= nil value)) (is (= [{:type :warn :message ["missing route" ::asd]}] - messages))))))) + messages)))) + + (rfh/stop! history)))) + +(deftest html5-history-routing-test + (when browser + (gevents/removeAll js/window goog.events.EventType.POPSTATE) + (gevents/removeAll js/window goog.events.EventType.HASHCHANGE) + + (async done + (let [n (atom 0) + history (rfh/start! router + (fn [match history] + (let [url (rfh/-get-path history)] + (case (swap! n inc) + 1 (do (rfh/push-state history ::frontpage)) + 2 (do (is (= "/" url) + "start at root") + (rfh/push-state history ::foo)) + 3 (do (is (= "/foo" url) + "push-state") + (.back js/window.history)) + 4 (do (is (= "/" url) + "go back") + (rfh/push-state history ::bar {:id 1})) + 5 (do (is (= "/bar/1" url) + "push-state 2") + (rfh/replace-state history ::bar {:id 2})) + 6 (do (is (= "/bar/2" url) + "replace-state") + (.back js/window.history)) + 7 (do (is (= "/" url) + "go back after replace state") + (rfh/stop! history) + (done)) + (do (is false "extra event"))))) + {:use-fragment false})])))) From 3b9130e640102e6867b0aaf963912800a8ef22b3 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Wed, 25 Jul 2018 09:10:04 +0300 Subject: [PATCH 05/55] composing routers --- doc/advanced/composing_routers.md | 302 ++++++++++++++++++++++++++---- 1 file changed, 264 insertions(+), 38 deletions(-) diff --git a/doc/advanced/composing_routers.md b/doc/advanced/composing_routers.md index 6fef1907..32f5e85a 100644 --- a/doc/advanced/composing_routers.md +++ b/doc/advanced/composing_routers.md @@ -1,79 +1,305 @@ # Composing Routers -Routers expose both their routes and options via the `Router` protocol, enabling one to create new routers from existing ones. +Once a router is created, the routing tree is immutable and cannot be changed. To modify the routes, we have to make a new copy of the router, with modified routes and/or options. For this, the `Router` exposes the resolved routes via `r/routes` and options via `r/options`. -## Adding routes to an existing routers +## Adding routes -Let's define a router in an `Atom`: +Let's create a router: ```clj (require '[reitit.core :as r]) -(def router (atom (r/router - [["/foo/bar" identity] - ["/foo/bar/:id" identity]]))) - -(r/routes @router) -;[["/foo/bar" {:handler #object[clojure.core$identity]}] -; ["/foo/bar/:id" {:handler #object[clojure.core$identity]}]] +(def router + (r/router + [["/foo" ::foo] + ["/bar/:id" ::bar]])) ``` -A helper to add new route to a router: +It's resolved routes and options: ```clj -(defn add-route [router route] +(r/routes router) +;[["/foo" {:name :user/foo}] +; ["/bar/:idr" {:name :user/bar}]] + +(r/options router) +;{:lookup #object[...] +; :expand #object[...] +; :coerce #object[...] +; :compile #object[...] +; :conflicts #object[...]} +``` + +A helper to create a new router with extra routes: + +```clj +(defn add-routes [router routes] (r/router - (conj (r/routes router) route) + (into (r/routes router) routes) (r/options router))) ``` -Now, we can add routers to the router: +New router with an extra route: ```clj -(swap! router add-route ["/foo/bar/:id/:subid" identity]) +(def router2 + (add-routes + router + [["/baz/:id/:subid" ::baz]])) -(r/routes @router) -;[["/foo/bar" {:handler #object[clojure.core$identity]}] -; ["/foo/bar/:id" {:handler #object[clojure.core$identity]}] -; ["/foo/bar/:id/:subid" {:handler #object[clojure.core$identity]}]] +(r/routes router2) +;[["/foo" {:name :user/bar}] +; ["/bar/:id" {:name :user/bar}] +; ["/baz/:id/:subid" {:name :user/baz}]] ``` -Router is recreated, so all the rules are fired: +All rules are applied, including the conflict resolution: ```clj -(swap! router add-route ["/foo/:fail" identity]) -;CompilerException clojure.lang.ExceptionInfo: Router contains conflicting routes: +(add-routes + router2 + [["/:this/should/:fail" ::fail]]) +;CompilerException clojure.lang.ExceptionInfo: Router contains conflicting route paths: ; -; /foo/bar -;-> /foo/:fail +; /baz/:id/:subid +;-> /:this/should/:fail ``` ## Merging routers -Given we have two routers: +A helper to merge routers: ```clj -(def r1 (r/router ["/route1" identity])) -(def r2 (r/router ["/route2" identity])) +(defn merge-routers [& routers] + (r/router + (apply merge (map r/routes routers)) + (apply merge (map r/options routers)))) ``` -We can create a new router, with merged routes and options: +Merging three routers into one: ```clj -(def r12 (r/router - (merge - (r/routes r1) - (r/routes r2)) - (merge - (r/options r1) - (r/options r2)))) +(def router + (merge-routers + (r/router ["/route1" ::route1]) + (r/router ["/route2" ::route2]) + (r/router ["/route3" ::route3]))) -(r/routes r12) -;[["/route1" {:handler #object[clojure.core$identity]}] -; ["/route2" {:handler #object[clojure.core$identity]}]] +(r/routes router) +;[["/route1" {:name :user/route1}] +; ["/route2" {:name :user/route2}] +; ["/route3" {:name :user/route3}]] ``` +## Nesting routers + +Routers can be nested too, using the catch-all parameter. + +A router with nested routers using a custom `:router` key: + +```clj +(def router + (r/router + [["/ping" :ping] + ["/olipa/*" {:name :olipa + :router (r/router + [["/olut" :olut] + ["/makkara" :makkara] + ["/kerran/*" {:name :kerran + :router (r/router + [["/avaruus" :avaruus] + ["/ihminen" :ihminen]])}]])}]])) +``` + +Matching by path: + +```clj +(r/match-by-path router "/olipa/kerran/iso/kala") +;#Match{:template "/olipa/*" +; :data {:name :olipa +; :router #object[reitit.core$mixed_router]} +; :result nil +; :path-params {: "kerran/iso/kala"} +; :path "/olipa/iso/kala"} +``` + +That not right, it should not have matched. The core routing doesn't understand anything about nesting, so it only matched against the top-level router, which gave a match for the catch-all path. + +As the `Match` contains the route data, we can create a new matching function that understands our custom `:router` syntax. Here is a function that does recursive matching using the subrouters. It returns either `nil` or a vector of mathces. + +```clj +(require '[clojure.string :as str]) + +(defn recursive-match-by-path [router path] + (if-let [match (r/match-by-path router path)] + (if-let [subrouter (-> match :data :router)] + (if-let [submatch (recursive-match-by-path subrouter (subs path (str/last-index-of (:template match) "/")))] + (into [match] submatch)) + [match]))) +``` + +With invalid nested path we get now `nil` as expected: + +```clj +(recursive-match-by-path router "/olipa/kerran/iso/kala") +; nil +``` + +With valid path we get all the nested matches: + +```clj +(recursive-match-by-path router "/olipa/kerran/avaruus") +;[#reitit.core.Match{:template "/olipa/*" +; :data {:name :olipa +; :router #object[reitit.core$mixed_router]} +; :result nil +; :path-params {: "kerran/avaruus"} +; :path "/olipa/kerran/avaruus"} +; #reitit.core.Match{:template "/kerran/*" +; :data {:name :kerran +; :router #object[reitit.core$lookup_router]} +; :result nil +; :path-params {: "avaruus"} +; :path "/kerran/avaruus"} +; #reitit.core.Match{:template "/avaruus" +; :data {:name :avaruus} +; :result nil +; :path-params {} +; :path "/avaruus"}] +``` + +Helper to get only the route names for matches: + +```clj +(defn name-path [router path] + (some->> (recursive-match-by-path router path) + (mapv (comp :name :data)))) + +(name-path router "/olipa/kerran/avaruus") +; [:olipa :kerran :avaruus] +``` + +## Dynamic routing + +In all the examples above, the routers were created ahead of time, making the whole route tree effective static. To do dynamic routing, we should use router references so that we can update the routes either on background or per request basis. Let's walk through both cases. + +First, we need to modify our matching function to support router references: + +```clj +(defn- << [x] + (if (instance? clojure.lang.IDeref x) (deref x) x)) + +(defn recursive-match-by-path [router path] + (if-let [match (r/match-by-path (<< router) path)] + (if-let [subrouter (-> match :data :router <<)] + (if-let [submatch (recursive-match-by-path subrouter (subs path (str/last-index-of (:template match) "/")))] + (into [match] submatch)) + [match]))) +``` + +A router that can be updated on demand, for example based on a domain event when a new entry in inserted into a database. We'll wrap the router into a `atom` to achieve this. + +```clj +(def beer-router + (atom + (r/router + [["/lager" :lager]]))) +``` + +Another router, which is re-created on each routing request. + +```clj +(def dynamic-router + (reify clojure.lang.IDeref + (deref [_] + (r/router + ["/duo" (keyword (gensym ""))])))) +``` + +Now we can compose the routers into a system-level static root router. + +```clj +(def router + (r/router + [["/gin/napue" :napue] + ["/ciders/*" :ciders] + ["/beers/*" {:name :beers + :router beer-router}] + ["/dynamic/*" {:name :other + :router dynamic-router}]])) +``` + +Matching root routes: + +```clj +(name-path "/vodka/russian") +; nil + +(name-path "/gin/napue") +; [:napue] +``` + +Matching (nested) beer routes: + +```clj +(name-path "/beers/lager") +; [:beers :lager] + +(name-path "/beers/saison") +; nil +``` + +No saison!? Let's add the route: + +```clj +(swap! beer-router add-routes [["/saison" :saison]]) +``` + +There we have it: + +```clj +(name-path "/beers/saison") +; [:beers :saison] +``` + +We can't add a conflicting routes: + +```clj +(swap! beer-router add-routes [["/saison" :saison]]) +;CompilerException clojure.lang.ExceptionInfo: Router contains conflicting route paths: +; +; /saison +;-> /saison +``` + +The dynamic routes are re-created on every request: + +```clj +(name-path "/dynamic/duo") +; [:other :2390883] + +(name-path "/dynamic/duo") +; [:other :2390893] +``` + +### Performance + +With nested routers, instead of having to do just one route match, matching is recursive, which adds a small cost. All nested routers need to be of type catch-all at top-level, which is order of magnitude slower than fully static routes. Dynamic routes are the slowest ones, at least an order of magnitude slower, as the router needs to be recreated for each request. + +Here's a quick benchmark on the recursive matches. + +| path | time | type +|------------------|---------|----------------------- +| `/gin/napue` | 40ns | static +| `/ciders/weston` | 440ns | catch-all +| `/beers/saison` | 600ns | catch-all + static +| `/other/drink` | 12000ns | catch-all + dynamic + +In this example, we could have wrapped the top-level router in an `atom` and add the beer-routes directly to it, making them order of magnitude faster. + ## TODO +* example how to do dynamic routing with `reitit-ring` +* create a `recursive-router` into a separate ns with all `r/routes` implemented correctly? * `reitit.core/merge-routes` to effectively merge routes with route data From 04bb5cd2f01db6afc026721e7f28368df6f9b1eb Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Wed, 25 Jul 2018 10:57:37 +0300 Subject: [PATCH 06/55] fix example --- doc/advanced/composing_routers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/advanced/composing_routers.md b/doc/advanced/composing_routers.md index 32f5e85a..900ccf71 100644 --- a/doc/advanced/composing_routers.md +++ b/doc/advanced/composing_routers.md @@ -293,7 +293,7 @@ Here's a quick benchmark on the recursive matches. | `/gin/napue` | 40ns | static | `/ciders/weston` | 440ns | catch-all | `/beers/saison` | 600ns | catch-all + static -| `/other/drink` | 12000ns | catch-all + dynamic +| `/dynamic/duo` | 12000ns | catch-all + dynamic In this example, we could have wrapped the top-level router in an `atom` and add the beer-routes directly to it, making them order of magnitude faster. From 6aa86cd055ba2021cb8a2c34e63a9fce2286d715 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Wed, 25 Jul 2018 11:08:11 +0300 Subject: [PATCH 07/55] typo --- doc/advanced/composing_routers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/advanced/composing_routers.md b/doc/advanced/composing_routers.md index 900ccf71..687214ce 100644 --- a/doc/advanced/composing_routers.md +++ b/doc/advanced/composing_routers.md @@ -48,7 +48,7 @@ New router with an extra route: [["/baz/:id/:subid" ::baz]])) (r/routes router2) -;[["/foo" {:name :user/bar}] +;[["/foo" {:name :user/foo}] ; ["/bar/:id" {:name :user/bar}] ; ["/baz/:id/:subid" {:name :user/baz}]] ``` From ef7a91697f3608d9cdcc2dca31f862e04a5ea718 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Wed, 25 Jul 2018 11:13:25 +0300 Subject: [PATCH 08/55] polish --- doc/advanced/composing_routers.md | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/doc/advanced/composing_routers.md b/doc/advanced/composing_routers.md index 687214ce..f2f23093 100644 --- a/doc/advanced/composing_routers.md +++ b/doc/advanced/composing_routers.md @@ -20,7 +20,7 @@ It's resolved routes and options: ```clj (r/routes router) ;[["/foo" {:name :user/foo}] -; ["/bar/:idr" {:name :user/bar}]] +; ["/bar/:id" {:name :user/bar}]] (r/options router) ;{:lookup #object[...] @@ -133,9 +133,10 @@ As the `Match` contains the route data, we can create a new matching function th (defn recursive-match-by-path [router path] (if-let [match (r/match-by-path router path)] (if-let [subrouter (-> match :data :router)] - (if-let [submatch (recursive-match-by-path subrouter (subs path (str/last-index-of (:template match) "/")))] - (into [match] submatch)) - [match]))) + (let [subpath (subs path (str/last-index-of (:template match) "/"))] + (if-let [submatch (recursive-match-by-path subrouter subpath)] + (cons match submatch))) + (list match)))) ``` With invalid nested path we get now `nil` as expected: @@ -186,15 +187,15 @@ In all the examples above, the routers were created ahead of time, making the wh First, we need to modify our matching function to support router references: ```clj -(defn- << [x] - (if (instance? clojure.lang.IDeref x) (deref x) x)) +(defn- << [x] (if (instance? clojure.lang.IDeref x) (deref x) x)) (defn recursive-match-by-path [router path] (if-let [match (r/match-by-path (<< router) path)] (if-let [subrouter (-> match :data :router <<)] - (if-let [submatch (recursive-match-by-path subrouter (subs path (str/last-index-of (:template match) "/")))] - (into [match] submatch)) - [match]))) + (let [subpath (subs path (str/last-index-of (:template match) "/"))] + (if-let [submatch (recursive-match-by-path subrouter subpath)] + (cons match submatch))) + (list match)))) ``` A router that can be updated on demand, for example based on a domain event when a new entry in inserted into a database. We'll wrap the router into a `atom` to achieve this. @@ -213,7 +214,7 @@ Another router, which is re-created on each routing request. (reify clojure.lang.IDeref (deref [_] (r/router - ["/duo" (keyword (gensym ""))])))) + ["/duo" (keyword (gensym "duo"))])))) ``` Now we can compose the routers into a system-level static root router. @@ -276,10 +277,10 @@ The dynamic routes are re-created on every request: ```clj (name-path "/dynamic/duo") -; [:other :2390883] +; [:other :duo2390883] (name-path "/dynamic/duo") -; [:other :2390893] +; [:other :duo2390893] ``` ### Performance From bf3007bfe1b84a45bd54a39a9a7fbb78b8cb8aea Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Thu, 26 Jul 2018 10:07:49 +0300 Subject: [PATCH 09/55] Support for sequential child routes --- CHANGELOG.md | 13 +++++++++++++ modules/reitit-core/src/reitit/core.cljc | 5 ++++- modules/reitit-core/src/reitit/spec.cljc | 2 +- test/cljc/reitit/core_test.cljc | 16 ++++++++++++++++ 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d758611d..5c64d8d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,19 @@ * should only concern you if you are not using [Muuntaja](https://github.com/metosin/muuntaja). * the `r/routes` returns just the path + data tuples as documented, not the compiled route results. To get the compiled results, use `r/compiled-routes` instead. * welcome route name conflict resolution! If router has routes with same names, router can't be created. fix 'em. +* sequential child routes are allowed, enabling this: + +```clj +(-> ["/api" + (for [i (range 4)] + [(str "/" i)])] + (r/router) + (r/routes)) +;[["/api/0" {}] +; ["/api/1" {}] +; ["/api/2" {}] +; ["/api/3" {}]] +``` ## `reitit-swagger` diff --git a/modules/reitit-core/src/reitit/core.cljc b/modules/reitit-core/src/reitit/core.cljc index 62a77c6d..ab6dc4fd 100644 --- a/modules/reitit-core/src/reitit/core.cljc +++ b/modules/reitit-core/src/reitit/core.cljc @@ -41,7 +41,10 @@ (walk-many pacc macc routes) (when (string? (first routes)) (let [[path & [maybe-arg :as args]] routes - [data childs] (if (or (vector? maybe-arg) (nil? maybe-arg)) + [data childs] (if (or (vector? maybe-arg) + (and (sequential? maybe-arg) + (sequential? (first maybe-arg))) + (nil? maybe-arg)) [{} args] [maybe-arg (rest args)]) macc (into macc (expand data opts)) diff --git a/modules/reitit-core/src/reitit/spec.cljc b/modules/reitit-core/src/reitit/spec.cljc index 1c0800f6..cc0dee44 100644 --- a/modules/reitit-core/src/reitit/spec.cljc +++ b/modules/reitit-core/src/reitit/spec.cljc @@ -9,7 +9,7 @@ (s/def ::path (s/with-gen string? #(gen/fmap (fn [s] (str "/" s)) (s/gen string?)))) -(s/def ::arg (s/and some? (complement vector?))) +(s/def ::arg (s/and some? (complement sequential?))) (s/def ::data (s/map-of keyword? any?)) (s/def ::result any?) diff --git a/test/cljc/reitit/core_test.cljc b/test/cljc/reitit/core_test.cljc index 19091509..cc1cfdb2 100644 --- a/test/cljc/reitit/core_test.cljc +++ b/test/cljc/reitit/core_test.cljc @@ -268,3 +268,19 @@ (-> router (r/match-by-name! ::route {:a "olipa", :b "kerran"}) (r/match->path {:iso "pöriläinen"})))))) + +(deftest sequential-routes + (testing "sequential child routes work" + (is (= [["/api/0" {}] + ["/api/1" {}]] + (-> ["/api" + (for [i (range 2)] + [(str "/" i)])] + (r/router) + (r/routes))))) + (testing "sequential route definition fails" + (is (thrown? + #?(:clj Exception, :cljs js/Error) + (-> ["/api" + (list "/ipa")] + (r/router)))))) From e879e66f261f80ebed6af3657189cc7eebc5e242 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Thu, 26 Jul 2018 10:40:04 +0300 Subject: [PATCH 10/55] Update guide --- doc/advanced/composing_routers.md | 164 +++++++++++++++++++++++++----- 1 file changed, 137 insertions(+), 27 deletions(-) diff --git a/doc/advanced/composing_routers.md b/doc/advanced/composing_routers.md index f2f23093..a6344c35 100644 --- a/doc/advanced/composing_routers.md +++ b/doc/advanced/composing_routers.md @@ -1,6 +1,10 @@ # Composing Routers -Once a router is created, the routing tree is immutable and cannot be changed. To modify the routes, we have to make a new copy of the router, with modified routes and/or options. For this, the `Router` exposes the resolved routes via `r/routes` and options via `r/options`. +Data-driven approach in `reitit` allows us to compose routes, route data, route specs, middleware and interceptors chains. We can compose routers too. This is needed to achieve dynamic routing like in [Compojure](https://github.com/weavejester/compojure). + +## Immutatability + +Once a router is created, the routing tree is immutable and cannot be changed. To change the routing, we need to create a new router with changed routes and/or options. For this, the `Router` protocol exposes it's resolved routes via `r/routes` and options via `r/options`. ## Adding routes @@ -15,7 +19,7 @@ Let's create a router: ["/bar/:id" ::bar]])) ``` -It's resolved routes and options: +We can query it's resolved routes and options: ```clj (r/routes router) @@ -30,7 +34,7 @@ It's resolved routes and options: ; :conflicts #object[...]} ``` -A helper to create a new router with extra routes: +Let's add a helper function to create a new router with extra routes: ```clj (defn add-routes [router routes] @@ -39,7 +43,7 @@ A helper to create a new router with extra routes: (r/options router))) ``` -New router with an extra route: +We can now create a new router with an extra routes: ```clj (def router2 @@ -53,7 +57,15 @@ New router with an extra route: ; ["/baz/:id/:subid" {:name :user/baz}]] ``` -All rules are applied, including the conflict resolution: +The original router was not changed: + +```clj +(r/routes router) +;[["/foo" {:name :user/foo}] +; ["/bar/:id" {:name :user/bar}]] +``` + +When a new router is created, all rules are applied, including the conflict resolution: ```clj (add-routes @@ -67,7 +79,7 @@ All rules are applied, including the conflict resolution: ## Merging routers -A helper to merge routers: +Let's create a helper function to merge routers: ```clj (defn merge-routers [& routers] @@ -76,7 +88,7 @@ A helper to merge routers: (apply merge (map r/options routers)))) ``` -Merging three routers into one: +We can now merge multiple routers into one: ```clj (def router @@ -93,9 +105,9 @@ Merging three routers into one: ## Nesting routers -Routers can be nested too, using the catch-all parameter. +Routers can be nested using the catch-all parameter. -A router with nested routers using a custom `:router` key: +Here's a router with deeply nested routers under a `:router` key in the route data: ```clj (def router @@ -123,9 +135,9 @@ Matching by path: ; :path "/olipa/iso/kala"} ``` -That not right, it should not have matched. The core routing doesn't understand anything about nesting, so it only matched against the top-level router, which gave a match for the catch-all path. +That didn't work as we wanted, as the nested routers don't have such a route. Thing is that the core routing doesn't understand anything about our new `:router` key, so it only matched against the top-level router, which gave a match for the catch-all path. -As the `Match` contains the route data, we can create a new matching function that understands our custom `:router` syntax. Here is a function that does recursive matching using the subrouters. It returns either `nil` or a vector of mathces. +As the `Match` contains all the route data, we can create a new matching function that understands the `:router` key. Below is a function that does recursive matching using the subrouters. It returns either `nil` or a vector of mathces. ```clj (require '[clojure.string :as str]) @@ -169,7 +181,7 @@ With valid path we get all the nested matches: ; :path "/avaruus"}] ``` -Helper to get only the route names for matches: +Let's create a helper to get only the route names for matches: ```clj (defn name-path [router path] @@ -180,14 +192,18 @@ Helper to get only the route names for matches: ; [:olipa :kerran :avaruus] ``` +So, we can nest routers, but why would we do that? + ## Dynamic routing -In all the examples above, the routers were created ahead of time, making the whole route tree effective static. To do dynamic routing, we should use router references so that we can update the routes either on background or per request basis. Let's walk through both cases. +In all the examples above, the routers were created ahead of time, making the whole route tree effective static. To have more dynamic routing, we can use router references allowing the router to be swapped over time. We can also create fully dynamic routers where the router is re-created for each request. Let's walk through both cases. First, we need to modify our matching function to support router references: ```clj -(defn- << [x] (if (instance? clojure.lang.IDeref x) (deref x) x)) +(defn- << [x] + (if (instance? clojure.lang.IDeref x) + (deref x) x)) (defn recursive-match-by-path [router path] (if-let [match (r/match-by-path (<< router) path)] @@ -198,7 +214,9 @@ First, we need to modify our matching function to support router references: (list match)))) ``` -A router that can be updated on demand, for example based on a domain event when a new entry in inserted into a database. We'll wrap the router into a `atom` to achieve this. +Then, we need some router (references). + +First, a reference to a router that can be updated on demand on background, for example when a new entry in inserted into a database. We'll wrap the router into a `atom`: ```clj (def beer-router @@ -207,17 +225,17 @@ A router that can be updated on demand, for example based on a domain event when [["/lager" :lager]]))) ``` -Another router, which is re-created on each routing request. +Second, a reference to router, which is re-created on each routing request: ```clj (def dynamic-router (reify clojure.lang.IDeref (deref [_] (r/router - ["/duo" (keyword (gensym "duo"))])))) + ["/duo" (keyword (str "duo" (rand-int 100)))])))) ``` -Now we can compose the routers into a system-level static root router. +We can compose the routers into a system-level static root router: ```clj (def router @@ -226,7 +244,7 @@ Now we can compose the routers into a system-level static root router. ["/ciders/*" :ciders] ["/beers/*" {:name :beers :router beer-router}] - ["/dynamic/*" {:name :other + ["/dynamic/*" {:name :dynamic :router dynamic-router}]])) ``` @@ -263,7 +281,7 @@ There we have it: ; [:beers :saison] ``` -We can't add a conflicting routes: +We can't add conflicting routes: ```clj (swap! beer-router add-routes [["/saison" :saison]]) @@ -277,17 +295,17 @@ The dynamic routes are re-created on every request: ```clj (name-path "/dynamic/duo") -; [:other :duo2390883] +; [:dynamic :duo71] (name-path "/dynamic/duo") -; [:other :duo2390893] +; [:dynamic :duo55] ``` ### Performance With nested routers, instead of having to do just one route match, matching is recursive, which adds a small cost. All nested routers need to be of type catch-all at top-level, which is order of magnitude slower than fully static routes. Dynamic routes are the slowest ones, at least an order of magnitude slower, as the router needs to be recreated for each request. -Here's a quick benchmark on the recursive matches. +A quick benchmark on the recursive lookups: | path | time | type |------------------|---------|----------------------- @@ -296,11 +314,103 @@ Here's a quick benchmark on the recursive matches. | `/beers/saison` | 600ns | catch-all + static | `/dynamic/duo` | 12000ns | catch-all + dynamic -In this example, we could have wrapped the top-level router in an `atom` and add the beer-routes directly to it, making them order of magnitude faster. +The non-recursive lookup for `/gin/napue` is around 23ns. + +Comparing the dynamic routing performance with Compojure: + +```clj +(require '[compojure.core :refer [context]) + +(def app + (context "/dynamic" [] (constantly :duo))) + +(app {:uri "/dynamic/duo" :request-method :get}) +; :duo +``` + +| path | time | type +|------------------|---------|----------------------- +| `/dynamic/duo` | 20000ns | compojure + +We could use the Router `:compile` hook to compile the nested routers for better performance. Also, the dynamic routing could be made faster, by allowing router creation time features like conflict resolution to be disabled. + +### When to use nested routers? + +Nesting routers is not trivial and because of that, should be avoided. For dynamic (request-time) route generation, it's the only choise. For other cases, nested routes are most likely a better option. + +Let's re-create the previous example with normal route composition. + +A helper to create beer-routes and the root router. + +```clj +(defn beer-routes [beers] + (for [beer beers] + [(str "/" beer) (keyword "beer" beer)])) + +(defn create-router [beer-routes] + (r/router + [["/gin/napue" :napue] + ["/ciders/*" :ciders] + ["/beers" beer-routes] + ["/dynamic/*" {:name :dynamic + :router dynamic-router}]])) +``` + +New new root router *reference* and a helper to reset it: + +```clj +(def router + (atom (create-router nil))) + +(defn reset-router! [beers] + (reset! router (-> beers beer-routes create-router))) +``` + +The routing tree: + +```clj +(r/routes @router) +;[["/gin/napue" {:name :napue}] +; ["/ciders/*" {:name :ciders}] +; ["/dynamic/*" {:name :dynamic, +; :router #object[user$reify__24359]}]] +``` + +Let's reset the router with some beers: + +```clj +(reset-router! ["lager" "sahti" "bock"]) +``` + +We can see that the beer routes are now embedded into the core router: + +```clj +(r/routes @router) +;[["/gin/napue" {:name :napue}] +; ["/ciders/*" {:name :ciders}] +; ["/beers/lager" {:name :beer/lager}] +; ["/beers/sahti" {:name :beer/sahti}] +; ["/beers/bock" {:name :beer/bock}] +; ["/dynamic/*" {:name :dynamic, +; :router #object[user$reify__24359]}]] +``` + +And the routing works: + +```clj +(name-path @router "/beers/sahti") +;[:beer/sahti] +``` + +The beer-routes all now match in constant time. + +| path | time | type +|-----------------|---------|----------------------- +| `/beers/sahti` | 40ns | static ## TODO -* example how to do dynamic routing with `reitit-ring` -* create a `recursive-router` into a separate ns with all `r/routes` implemented correctly? -* `reitit.core/merge-routes` to effectively merge routes with route data +* add an example how to do dynamic routing with `reitit-ring` +* maybe create a `recursive-router` into a separate ns with all `Router` functions implemented correctly? maybe not... +* add `reitit.core/merge-routes` to effectively merge routes with route data From 055a03c7936597333a919b637b85a15d2d2d9eee Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Fri, 27 Jul 2018 15:10:02 +0300 Subject: [PATCH 11/55] prepare --- test/cljc/reitit/interceptor_test.cljc | 13 ++++++++----- test/cljc/reitit/middleware_test.cljc | 15 +++++++++------ 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/test/cljc/reitit/interceptor_test.cljc b/test/cljc/reitit/interceptor_test.cljc index ded650c5..d6a5fe5f 100644 --- a/test/cljc/reitit/interceptor_test.cljc +++ b/test/cljc/reitit/interceptor_test.cljc @@ -24,11 +24,14 @@ (defn handler [ctx] (conj ctx :ok)) -(defn create [interceptors] - (let [chain (interceptor/chain - interceptors - handler :data nil)] - (partial execute chain))) +(defn create + ([interceptors] + (create interceptors nil)) + ([interceptors opts] + (let [chain (interceptor/chain + interceptors + handler :data opts)] + (partial execute chain)))) (deftest expand-interceptor-test diff --git a/test/cljc/reitit/middleware_test.cljc b/test/cljc/reitit/middleware_test.cljc index ee5c7277..7987a977 100644 --- a/test/cljc/reitit/middleware_test.cljc +++ b/test/cljc/reitit/middleware_test.cljc @@ -10,12 +10,15 @@ (defn handler [request] (conj request :ok)) -(defn create [middleware] - (middleware/chain - middleware - handler - :data - nil)) +(defn create + ([middleware] + (create middleware nil)) + ([middleware opts] + (middleware/chain + middleware + handler + :data + opts))) (deftest expand-middleware-test From 94431352b86ff3ad31724b78de8f91ce44cab06f Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Fri, 27 Jul 2018 15:14:00 +0300 Subject: [PATCH 12/55] Welcome Middleware registry! --- .../reitit-core/src/reitit/middleware.cljc | 11 ++++++++++ test/cljc/reitit/middleware_test.cljc | 20 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/modules/reitit-core/src/reitit/middleware.cljc b/modules/reitit-core/src/reitit/middleware.cljc index 591a9c97..c9335cfa 100644 --- a/modules/reitit-core/src/reitit/middleware.cljc +++ b/modules/reitit-core/src/reitit/middleware.cljc @@ -13,6 +13,17 @@ (extend-protocol IntoMiddleware + #?(:clj clojure.lang.Keyword + :cljs cljs.core.Keyword) + (into-middleware [this data {:keys [::registry] :as opts}] + (or (if-let [middleware (if registry (registry this))] + (into-middleware middleware data opts)) + (throw + (ex-info + (str "Middleware " (pr-str this) " not found in registry.") + {:keyword this + :registry registry})))) + #?(:clj clojure.lang.APersistentVector :cljs cljs.core.PersistentVector) (into-middleware [[f & args] data opts] diff --git a/test/cljc/reitit/middleware_test.cljc b/test/cljc/reitit/middleware_test.cljc index 7987a977..11f75c7f 100644 --- a/test/cljc/reitit/middleware_test.cljc +++ b/test/cljc/reitit/middleware_test.cljc @@ -45,6 +45,26 @@ (is (= [:value :ok] (app request))) (is (= 1 @calls))))) + (testing "as keyword" + (reset! calls 0) + (let [app (create [:wrap] {::middleware/registry {:wrap #(wrap % :value)}})] + (dotimes [_ 10] + (is (= [:value :ok] (app request))) + (is (= 1 @calls))))) + + (testing "as keyword vector" + (reset! calls 0) + (let [app (create [[:wrap :value]] {::middleware/registry {:wrap wrap}})] + (dotimes [_ 10] + (is (= [:value :ok] (app request))) + (is (= 1 @calls))))) + + (testing "missing keyword" + (is (thrown-with-msg? + ExceptionInfo + #"Middleware :wrap not found in registry" + (create [:wrap])))) + (testing "as function vector with value(s)" (reset! calls 0) (let [app (create [[wrap :value]])] From 6c47b5fa9439d46df271023f5579bb6ac06ee65f Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Fri, 27 Jul 2018 15:14:10 +0300 Subject: [PATCH 13/55] Welcome Interceptor registry! --- modules/reitit-core/src/reitit/interceptor.cljc | 11 +++++++++++ test/cljc/reitit/interceptor_test.cljc | 13 +++++++++++++ 2 files changed, 24 insertions(+) diff --git a/modules/reitit-core/src/reitit/interceptor.cljc b/modules/reitit-core/src/reitit/interceptor.cljc index 6f129621..258bf1e1 100644 --- a/modules/reitit-core/src/reitit/interceptor.cljc +++ b/modules/reitit-core/src/reitit/interceptor.cljc @@ -13,6 +13,17 @@ (extend-protocol IntoInterceptor + #?(:clj clojure.lang.Keyword + :cljs cljs.core.Keyword) + (into-interceptor [this data {:keys [::registry] :as opts}] + (or (if-let [interceptor (if registry (registry this))] + (into-interceptor interceptor data opts)) + (throw + (ex-info + (str "Interceptor " (pr-str this) " not found in registry.") + {:keyword this + :registry registry})))) + #?(:clj clojure.lang.APersistentVector :cljs cljs.core.PersistentVector) (into-interceptor [[f & args :as form] data opts] diff --git a/test/cljc/reitit/interceptor_test.cljc b/test/cljc/reitit/interceptor_test.cljc index d6a5fe5f..2c374b7d 100644 --- a/test/cljc/reitit/interceptor_test.cljc +++ b/test/cljc/reitit/interceptor_test.cljc @@ -58,6 +58,19 @@ (is (= [:value :ok] (app ctx))) (is (= 1 @calls))))) + (testing "as keyword" + (reset! calls 0) + (let [app (create [:enter] {::interceptor/registry {:enter (enter :value)}})] + (dotimes [_ 10] + (is (= [:value :ok] (app ctx))) + (is (= 1 @calls))))) + + (testing "missing keyword" + (is (thrown-with-msg? + ExceptionInfo + #"Interceptor :enter not found in registry" + (create [:enter])))) + (testing "as map" (reset! calls 0) (let [app (create [{:enter (enter :value)}])] From dc0fae875a727fea5670966235c0343553fc17d5 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Fri, 27 Jul 2018 15:25:03 +0300 Subject: [PATCH 14/55] CHANGELOG --- CHANGELOG.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c64d8d5..2d1166c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,32 @@ ; ["/api/3" {}]] ``` +* Welcome Middleware and Intercetor Registries! + * when Keywords are used in place of middleware / interceptor, a lookup is done into Router option `::middleware/registry` (or `::interceptor/registrty`) with the key. Fails fast with missing registry entries. + * fixes [#32](https://github.com/metosin/reitit/issues/32) + + ```clj + (require '[reitit.ring :as ring]) + (require '[reitit.middleware :as middleware]) + + (defn wrap-xyz [handler value] + (fn [request] + (handler (update request :xyz (fnil + 0) value)))) + + (def app + (ring/ring-handler + (ring/router + ["/api" {:middleware [[:xyz 20]]} + ["/ping" {:middleware [:xyz10] + :get identity}]] + {::middleware/registry {:xyz wrap-xyz + :xyz10 [:xyz 10]}}))) + + (-> {:request-method :get, :uri "/api/ping"} (app) :xyz) + ; 30 + ``` + + ## `reitit-swagger` * In case of just one swagger api per router, the swagger api doesn't have to identified, so this works now: From 8321589f046d87c10344ab3aeb240d5585410f1d Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sat, 28 Jul 2018 12:01:12 +0300 Subject: [PATCH 15/55] Polish docs --- CHANGELOG.md | 44 ++++++------- doc/SUMMARY.md | 1 + doc/advanced/composing_routers.md | 45 +++++++------ doc/cljdoc.edn | 2 + doc/ring/README.md | 1 + doc/ring/middleware_registry.md | 63 +++++++++++++++++++ doc/ring/ring.md | 6 +- .../reitit-core/src/reitit/interceptor.cljc | 3 +- .../reitit-core/src/reitit/middleware.cljc | 11 +++- 9 files changed, 127 insertions(+), 49 deletions(-) create mode 100644 doc/ring/middleware_registry.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d1166c2..4d073140 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,31 +20,33 @@ ; ["/api/3" {}]] ``` +* A [Guide to compose routers](https://metosin.github.io/reitit/advanced/composing_routers.html) * Welcome Middleware and Intercetor Registries! - * when Keywords are used in place of middleware / interceptor, a lookup is done into Router option `::middleware/registry` (or `::interceptor/registrty`) with the key. Fails fast with missing registry entries. - * fixes [#32](https://github.com/metosin/reitit/issues/32) + * when Keywords are used in place of middleware / interceptor, a lookup is done into Router option `::middleware/registry` (or `::interceptor/registry`) with the key. Fails fast with missing registry entries. + * fixes [#32](https://github.com/metosin/reitit/issues/32). + * full documentation [here](https://metosin.github.io/reitit/ring/middleware_registry.html). ```clj - (require '[reitit.ring :as ring]) - (require '[reitit.middleware :as middleware]) - - (defn wrap-xyz [handler value] - (fn [request] - (handler (update request :xyz (fnil + 0) value)))) - - (def app - (ring/ring-handler - (ring/router - ["/api" {:middleware [[:xyz 20]]} - ["/ping" {:middleware [:xyz10] - :get identity}]] - {::middleware/registry {:xyz wrap-xyz - :xyz10 [:xyz 10]}}))) - - (-> {:request-method :get, :uri "/api/ping"} (app) :xyz) - ; 30 - ``` +(require '[reitit.ring :as ring]) +(require '[reitit.middleware :as middleware]) +(defn wrap-bonus [handler value] + (fn [request] + (handler (update request :bonus (fnil + 0) value)))) + +(def app + (ring/ring-handler + (ring/router + ["/api" {:middleware [[:bonus 20]]} + ["/bonus" {:middleware [:bonus10] + :get (fn [{:keys [bonus]}] + {:status 200, :body {:bonus bonus}})}]] + {::middleware/registry {:bonus wrap-bonus + :bonus10 [:bonus 10]}}))) + +(app {:request-method :get, :uri "/api/bonus"}) +; {:status 200, :body {:bonus 30}} + ``` ## `reitit-swagger` diff --git a/doc/SUMMARY.md b/doc/SUMMARY.md index ac3e50b1..1e303093 100644 --- a/doc/SUMMARY.md +++ b/doc/SUMMARY.md @@ -27,6 +27,7 @@ * [Static Resources](ring/static.md) * [Dynamic Extensions](ring/dynamic_extensions.md) * [Data-driven Middleware](ring/data_driven_middleware.md) + * [Middleware Registry](ring/middleware_registry.md) * [Pluggable Coercion](ring/coercion.md) * [Route Data Validation](ring/route_data_validation.md) * [Compiling Middleware](ring/compiling_middleware.md) diff --git a/doc/advanced/composing_routers.md b/doc/advanced/composing_routers.md index a6344c35..642c5819 100644 --- a/doc/advanced/composing_routers.md +++ b/doc/advanced/composing_routers.md @@ -19,7 +19,7 @@ Let's create a router: ["/bar/:id" ::bar]])) ``` -We can query it's resolved routes and options: +We can query the resolved routes and options: ```clj (r/routes router) @@ -135,7 +135,7 @@ Matching by path: ; :path "/olipa/iso/kala"} ``` -That didn't work as we wanted, as the nested routers don't have such a route. Thing is that the core routing doesn't understand anything about our new `:router` key, so it only matched against the top-level router, which gave a match for the catch-all path. +That didn't work as we wanted, as the nested routers don't have such a route. The core routing doesn't understand anything the `:router` key, so it only matched against the top-level router, which gave a match for the catch-all path. As the `Match` contains all the route data, we can create a new matching function that understands the `:router` key. Below is a function that does recursive matching using the subrouters. It returns either `nil` or a vector of mathces. @@ -214,9 +214,9 @@ First, we need to modify our matching function to support router references: (list match)))) ``` -Then, we need some router (references). +Then, we need some routers. -First, a reference to a router that can be updated on demand on background, for example when a new entry in inserted into a database. We'll wrap the router into a `atom`: +First, a reference to a router that can be updated on background, for example when a new entry in inserted into a database. We'll wrap the router into a `atom`: ```clj (def beer-router @@ -251,20 +251,20 @@ We can compose the routers into a system-level static root router: Matching root routes: ```clj -(name-path "/vodka/russian") +(name-path router "/vodka/russian") ; nil -(name-path "/gin/napue") +(name-path router "/gin/napue") ; [:napue] ``` Matching (nested) beer routes: ```clj -(name-path "/beers/lager") +(name-path router "/beers/lager") ; [:beers :lager] -(name-path "/beers/saison") +(name-path router "/beers/saison") ; nil ``` @@ -277,7 +277,7 @@ No saison!? Let's add the route: There we have it: ```clj -(name-path "/beers/saison") +(name-path router "/beers/saison") ; [:beers :saison] ``` @@ -294,16 +294,16 @@ We can't add conflicting routes: The dynamic routes are re-created on every request: ```clj -(name-path "/dynamic/duo") +(name-path router "/dynamic/duo") ; [:dynamic :duo71] -(name-path "/dynamic/duo") +(name-path router "/dynamic/duo") ; [:dynamic :duo55] ``` ### Performance -With nested routers, instead of having to do just one route match, matching is recursive, which adds a small cost. All nested routers need to be of type catch-all at top-level, which is order of magnitude slower than fully static routes. Dynamic routes are the slowest ones, at least an order of magnitude slower, as the router needs to be recreated for each request. +With nested routers, instead of having to do just one route match, matching is recursive, which adds a small cost. All nested routers need to be of type catch-all at top-level, which is order of magnitude slower than fully static routes. Dynamic routes are the slowest ones, at least two orders of magnitude slower, as the router needs to be recreated for each request. A quick benchmark on the recursive lookups: @@ -332,26 +332,23 @@ Comparing the dynamic routing performance with Compojure: |------------------|---------|----------------------- | `/dynamic/duo` | 20000ns | compojure -We could use the Router `:compile` hook to compile the nested routers for better performance. Also, the dynamic routing could be made faster, by allowing router creation time features like conflict resolution to be disabled. +Can we make the nester routing faster? Sure. We could use the Router `:compile` hook to compile the nested routers for better performance. We could also allow router creation rules to be disabled, to get the dynamic routing much faster. ### When to use nested routers? -Nesting routers is not trivial and because of that, should be avoided. For dynamic (request-time) route generation, it's the only choise. For other cases, nested routes are most likely a better option. +Nesting routers is not trivial and because of that, should be avoided. For dynamic (request-time) route generation, it's the only choise. For other cases, nested routes are most likely a better option. -Let's re-create the previous example with normal route composition. +Let's re-create the previous example with normal route nesting/composition. -A helper to create beer-routes and the root router. +A helper to the root router: ```clj -(defn beer-routes [beers] - (for [beer beers] - [(str "/" beer) (keyword "beer" beer)])) - -(defn create-router [beer-routes] +(defn create-router [beers] (r/router [["/gin/napue" :napue] ["/ciders/*" :ciders] - ["/beers" beer-routes] + ["/beers" (for [beer beers] + [(str "/" beer) (keyword "beer" beer)])] ["/dynamic/*" {:name :dynamic :router dynamic-router}]])) ``` @@ -363,7 +360,7 @@ New new root router *reference* and a helper to reset it: (atom (create-router nil))) (defn reset-router! [beers] - (reset! router (-> beers beer-routes create-router))) + (reset! router (create-router beers))) ``` The routing tree: @@ -402,7 +399,7 @@ And the routing works: ;[:beer/sahti] ``` -The beer-routes all now match in constant time. +All the beer-routes now match in constant time. | path | time | type |-----------------|---------|----------------------- diff --git a/doc/cljdoc.edn b/doc/cljdoc.edn index d6bc56c4..bcb24a25 100644 --- a/doc/cljdoc.edn +++ b/doc/cljdoc.edn @@ -28,6 +28,7 @@ {:file "doc/advanced/README.md"} ["Configuring Routers" {:file "doc/advanced/configuring_routers.md"}] + ["Composing Routers" {:file "doc/advanced/composing_routers.md"}] ["Different Routers" {:file "doc/advanced/different_routers.md"}] ["Route Validation" {:file "doc/advanced/route_validation.md"}] ["Dev Workflow" {:file "doc/advanced/dev_workflow.md"}]] @@ -40,6 +41,7 @@ ["Dynamic Extensions" {:file "doc/ring/dynamic_extensions.md"}] ["Data-driven Middleware" {:file "doc/ring/data_driven_middleware.md"}] + ["Middleware Registry" {:file "doc/ring/middleware_registry.md"}] ["Pluggable Coercion" {:file "doc/ring/coercion.md"}] ["Route Data Validation" {:file "doc/ring/route_data_validation.md"}] diff --git a/doc/ring/README.md b/doc/ring/README.md index dae3335e..87356e08 100644 --- a/doc/ring/README.md +++ b/doc/ring/README.md @@ -6,6 +6,7 @@ * [Static Resources](static.md) * [Dynamic Extensions](dynamic_extensions.md) * [Data-driven Middleware](data_driven_middleware.md) +* [Middleware Registry](middleware_registry.md) * [Pluggable Coercion](coercion.md) * [Route Data Validation](route_data_validation.md) * [Compiling Middleware](compiling_middleware.md) diff --git a/doc/ring/middleware_registry.md b/doc/ring/middleware_registry.md new file mode 100644 index 00000000..00f618d8 --- /dev/null +++ b/doc/ring/middleware_registry.md @@ -0,0 +1,63 @@ +# Middleware Registry + +The `:middleware` syntax in `reitit-ring` supports also Keywords. Keywords are looked from Middleware Registry, which is a map of `keyword => IntoMiddleware`. Middleware registry should be stored under key `:reitit.middleware/registry` in the router options. If a middleware keyword isn't found in the registry, router creation fails fast with descriptive error message. + +## Examples + +Application using middleware defined in the Middleware Registry: + +```clj +(require '[reitit.ring :as ring]) +(require '[reitit.middleware :as middleware]) + +(defn wrap-bonus [handler value] + (fn [request] + (handler (update request :bonus (fnil + 0) value)))) + +(def app + (ring/ring-handler + (ring/router + ["/api" {:middleware [[:bonus 20]]} + ["/bonus" {:middleware [:bonus10] + :get (fn [{:keys [bonus]}] + {:status 200, :body {:bonus bonus}})}]] + {::middleware/registry {:bonus wrap-bonus + :bonus10 [:bonus 10]}}))) +``` + +Works as expected: + +```clj +(app {:request-method :get, :uri "/api/bonus"}) +; {:status 200, :body {:bonus 30}} +``` + +Router creation fails fast if registry doesn't contain the Middleware: + +```clj +(def app + (ring/ring-handler + (ring/router + ["/api" {:middleware [[:bonus 20]]} + ["/bonus" {:middleware [:bonus10] + :get (fn [{:keys [bonus]}] + {:status 200, :body {:bonus bonus}})}]] + {::middleware/registry {:bonus wrap-bonus}}))) +;CompilerException clojure.lang.ExceptionInfo: Middleware :bonus10 not found in registry. +; +;Available middleware in registry: +; +;| :id | :description | +;|--------+--------------------------------------| +;| :bonus | reitit.ring_test$wrap_bonus@59fddabb | +``` + +## When to use the registry? + +Middleware as Keywords helps to keep the routes (all but handlers) as literal data (e.g. data that evaluates to itself) enabling the routes to be persisted in external formats like EDN-files and databases. Duct is a good example where the [middleware can be referenced from EDN-files](https://github.com/duct-framework/duct/wiki/Configuration). It should be easy to make Duct configuration a Middleware Registry in `reitit-ring`. + +The bad thing it's an extra indirection, making things more complex and removed the default IDE-support of "goto definition" or "look source". + +## TODO + +* a prefilled registry of common middleware in the `reitit-middleware` diff --git a/doc/ring/ring.md b/doc/ring/ring.md index 1b916fd2..756b6f9a 100644 --- a/doc/ring/ring.md +++ b/doc/ring/ring.md @@ -80,10 +80,12 @@ Name-based reverse routing: # Middleware -Middleware can be added with a `:middleware` key, either to top-level or under `:request-method` submap. It's value should be a vector value of the following: +Middleware can be added with a `:middleware` key, either to top-level or under `:request-method` submap. It's value should be a vector of any the following: 1. normal ring middleware function `handler -> request -> response` -2. vector of middleware function `handler ?args -> request -> response` and optinally it's args. +2. vector of middleware function `[handler args*] -> request -> response` and it's arguments +3. a [data-driven middleware](data_driven_middleware.md) record or a map +4. a Keyword name, to lookup the middleware from a [Middleware Registry](middleware_registry.md) A middleware and a handler: diff --git a/modules/reitit-core/src/reitit/interceptor.cljc b/modules/reitit-core/src/reitit/interceptor.cljc index 258bf1e1..3722888f 100644 --- a/modules/reitit-core/src/reitit/interceptor.cljc +++ b/modules/reitit-core/src/reitit/interceptor.cljc @@ -20,7 +20,7 @@ (into-interceptor interceptor data opts)) (throw (ex-info - (str "Interceptor " (pr-str this) " not found in registry.") + (str "Interceptor " this " not found in registry.") {:keyword this :registry registry})))) @@ -126,6 +126,7 @@ | key | description | | --------------------------------|-------------| | `:reitit.interceptor/transform` | Function of [Interceptor] => [Interceptor] to transform the expanded Interceptors (default: identity). + | `:reitit.interceptor/registry` | Map of `keyword => IntoInterceptor` to replace keyword references into Interceptor See router options from [[reitit.core/router]]." ([data] diff --git a/modules/reitit-core/src/reitit/middleware.cljc b/modules/reitit-core/src/reitit/middleware.cljc index c9335cfa..fe0a8f80 100644 --- a/modules/reitit-core/src/reitit/middleware.cljc +++ b/modules/reitit-core/src/reitit/middleware.cljc @@ -1,5 +1,6 @@ (ns reitit.middleware (:require [meta-merge.core :refer [meta-merge]] + [clojure.pprint :as pprint] [reitit.core :as r] [reitit.impl :as impl])) @@ -20,7 +21,14 @@ (into-middleware middleware data opts)) (throw (ex-info - (str "Middleware " (pr-str this) " not found in registry.") + (str + "Middleware " this " not found in registry.\n\n" + (if (seq registry) + (str + "Available middleware in registry:\n" + (with-out-str + (pprint/print-table [:id :description] (for [[k v] registry] {:id k :description v})))) + "see [reitit.middleware/router] on how to add middleware to the registry.\n") "\n") {:keyword this :registry registry})))) @@ -127,6 +135,7 @@ | key | description | | -------------------------------|-------------| | `:reitit.middleware/transform` | Function of `[Middleware] => [Middleware]` to transform the expanded Middleware (default: identity). + | `:reitit.middleware/registry` | Map of `keyword => IntoMiddleware` to replace keyword references into Middleware See other router options from [[reitit.core/router]]." ([data] From 604291f98ecab6524ef29d12f5cebde2cfeb8baa Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sat, 28 Jul 2018 12:05:12 +0300 Subject: [PATCH 16/55] Better interceptor error messages --- modules/reitit-core/src/reitit/interceptor.cljc | 12 ++++++++++-- modules/reitit-core/src/reitit/middleware.cljc | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/modules/reitit-core/src/reitit/interceptor.cljc b/modules/reitit-core/src/reitit/interceptor.cljc index 3722888f..8f9cfd0c 100644 --- a/modules/reitit-core/src/reitit/interceptor.cljc +++ b/modules/reitit-core/src/reitit/interceptor.cljc @@ -1,5 +1,6 @@ (ns reitit.interceptor (:require [meta-merge.core :refer [meta-merge]] + [clojure.pprint :as pprint] [reitit.core :as r] [reitit.impl :as impl])) @@ -20,8 +21,15 @@ (into-interceptor interceptor data opts)) (throw (ex-info - (str "Interceptor " this " not found in registry.") - {:keyword this + (str + "Interceptor " this " not found in registry.\n\n" + (if (seq registry) + (str + "Available interceptors in registry:\n" + (with-out-str + (pprint/print-table [:id :description] (for [[k v] registry] {:id k :description v})))) + "see [reitit.interceptor/router] on how to add interceptor to the registry.\n") "\n") + {:id this :registry registry})))) #?(:clj clojure.lang.APersistentVector diff --git a/modules/reitit-core/src/reitit/middleware.cljc b/modules/reitit-core/src/reitit/middleware.cljc index fe0a8f80..f429aac1 100644 --- a/modules/reitit-core/src/reitit/middleware.cljc +++ b/modules/reitit-core/src/reitit/middleware.cljc @@ -29,7 +29,7 @@ (with-out-str (pprint/print-table [:id :description] (for [[k v] registry] {:id k :description v})))) "see [reitit.middleware/router] on how to add middleware to the registry.\n") "\n") - {:keyword this + {:id this :registry registry})))) #?(:clj clojure.lang.APersistentVector From bb4f861f00a4ef055b5e83dba63c455376e1a5a8 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sat, 28 Jul 2018 12:07:16 +0300 Subject: [PATCH 17/55] 0.2.0-SNAPSHOT --- CHANGELOG.md | 2 +- README.md | 14 +++++++------- doc/README.md | 14 +++++++------- doc/ring/ring.md | 2 +- doc/ring/swagger.md | 4 ++-- examples/frontend-controllers/project.clj | 6 +++--- examples/frontend/project.clj | 6 +++--- examples/just-coercion-with-ring/project.clj | 2 +- examples/ring-example/project.clj | 2 +- examples/ring-swagger/project.clj | 2 +- modules/reitit-core/project.clj | 2 +- modules/reitit-frontend/project.clj | 2 +- modules/reitit-ring/project.clj | 2 +- modules/reitit-schema/project.clj | 2 +- modules/reitit-spec/project.clj | 2 +- modules/reitit-swagger-ui/project.clj | 2 +- modules/reitit-swagger/project.clj | 2 +- modules/reitit/project.clj | 2 +- project.clj | 18 +++++++++--------- 19 files changed, 44 insertions(+), 44 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d073140..560e5910 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## UNRELEASED +## 0.2.0-SNAPSHOT ## `reitit-core` diff --git a/README.md b/README.md index aa540f0d..bf836881 100644 --- a/README.md +++ b/README.md @@ -36,18 +36,18 @@ Bubblin' under: All bundled: ```clj -[metosin/reitit "0.1.4-SNAPSHOT"] +[metosin/reitit "0.2.0-SNAPSHOT"] ``` Optionally, the parts can be required separately: ```clj -[metosin/reitit-core "0.1.4-SNAPSHOT"] -[metosin/reitit-ring "0.1.4-SNAPSHOT"] -[metosin/reitit-spec "0.1.4-SNAPSHOT"] -[metosin/reitit-schema "0.1.4-SNAPSHOT"] -[metosin/reitit-swagger "0.1.4-SNAPSHOT"] -[metosin/reitit-swagger-ui "0.1.4-SNAPSHOT"] +[metosin/reitit-core "0.2.0-SNAPSHOT"] +[metosin/reitit-ring "0.2.0-SNAPSHOT"] +[metosin/reitit-spec "0.2.0-SNAPSHOT"] +[metosin/reitit-schema "0.2.0-SNAPSHOT"] +[metosin/reitit-swagger "0.2.0-SNAPSHOT"] +[metosin/reitit-swagger-ui "0.2.0-SNAPSHOT"] ``` ## Quick start diff --git a/doc/README.md b/doc/README.md index d1fb5318..00593698 100644 --- a/doc/README.md +++ b/doc/README.md @@ -25,18 +25,18 @@ Modules: To use Reitit, add the following dependency to your project: ```clj -[metosin/reitit "0.1.4-SNAPSHOT"] +[metosin/reitit "0.2.0-SNAPSHOT"] ``` Optionally, the parts can be required separately: ```clj -[metosin/reitit-core "0.1.4-SNAPSHOT"] -[metosin/reitit-ring "0.1.4-SNAPSHOT"] -[metosin/reitit-spec "0.1.4-SNAPSHOT"] -[metosin/reitit-schema "0.1.4-SNAPSHOT"] -[metosin/reitit-swagger "0.1.4-SNAPSHOT"] -[metosin/reitit-swagger-ui "0.1.4-SNAPSHOT"] +[metosin/reitit-core "0.2.0-SNAPSHOT"] +[metosin/reitit-ring "0.2.0-SNAPSHOT"] +[metosin/reitit-spec "0.2.0-SNAPSHOT"] +[metosin/reitit-schema "0.2.0-SNAPSHOT"] +[metosin/reitit-swagger "0.2.0-SNAPSHOT"] +[metosin/reitit-swagger-ui "0.2.0-SNAPSHOT"] [metosin/frontend "0.1.4-SNAPSHOT"] ``` diff --git a/doc/ring/ring.md b/doc/ring/ring.md index 756b6f9a..6bbc71eb 100644 --- a/doc/ring/ring.md +++ b/doc/ring/ring.md @@ -3,7 +3,7 @@ [Ring](https://github.com/ring-clojure/ring) is a Clojure web applications library inspired by Python's WSGI and Ruby's Rack. By abstracting the details of HTTP into a simple, unified API, Ring allows web applications to be constructed of modular components that can be shared among a variety of applications, web servers, and web frameworks. ```clj -[metosin/reitit-ring "0.1.4-SNAPSHOT"] +[metosin/reitit-ring "0.2.0-SNAPSHOT"] ``` Ring-router adds support for [handlers](https://github.com/ring-clojure/ring/wiki/Concepts#handlers), [middleware](https://github.com/ring-clojure/ring/wiki/Concepts#middleware) and routing based on `:request-method`. Ring-router is created with `reitit.ring/router` function. It uses a custom route compiler, creating a optimized data structure for handling route matches, with compiled middleware chain & handlers for all request methods. It also ensures that all routes have a `:handler` defined. `reitit.ring/ring-handler` is used to create a Ring handler out of ring-router. diff --git a/doc/ring/swagger.md b/doc/ring/swagger.md index ba84dc5b..23ed2855 100644 --- a/doc/ring/swagger.md +++ b/doc/ring/swagger.md @@ -1,7 +1,7 @@ # Swagger Support ``` -[metosin/reitit-swagger "0.1.4-SNAPSHOT"] +[metosin/reitit-swagger "0.2.0-SNAPSHOT"] ``` Reitit supports [Swagger2](https://swagger.io/) documentation, thanks to [schema-tools](https://github.com/metosin/schema-tools) and [spec-tools](https://github.com/metosin/spec-tools). Documentation is extracted from route definitions, coercion `:parameters` and `:responses` and from a set of new documentation keys. @@ -44,7 +44,7 @@ If you need to post-process the generated spec, just wrap the handler with a cus [Swagger-ui](https://github.com/swagger-api/swagger-ui) is a user interface to visualize and interact with the Swagger specification. To make things easy, there is a pre-integrated version of the swagger-ui as a separate module. ``` -[metosin/reitit-swagger-ui "0.1.4-SNAPSHOT"] +[metosin/reitit-swagger-ui "0.2.0-SNAPSHOT"] ``` `reitit.swagger-ui/create-swagger-ui-hander` can be used to create a ring-handler to serve the swagger-ui. It accepts the following options: diff --git a/examples/frontend-controllers/project.clj b/examples/frontend-controllers/project.clj index c040a046..feab3f83 100644 --- a/examples/frontend-controllers/project.clj +++ b/examples/frontend-controllers/project.clj @@ -11,9 +11,9 @@ [compojure "1.6.1"] [hiccup "1.0.5"] [org.clojure/clojurescript "1.10.339"] - [metosin/reitit "0.1.4-SNAPSHOT"] - [metosin/reitit-schema "0.1.4-SNAPSHOT"] - [metosin/reitit-frontend "0.1.4-SNAPSHOT"] + [metosin/reitit "0.2.0-SNAPSHOT"] + [metosin/reitit-schema "0.2.0-SNAPSHOT"] + [metosin/reitit-frontend "0.2.0-SNAPSHOT"] ;; Just for pretty printting the match [fipp "0.6.12"]] diff --git a/examples/frontend/project.clj b/examples/frontend/project.clj index f28413ca..62d4cfc3 100644 --- a/examples/frontend/project.clj +++ b/examples/frontend/project.clj @@ -11,9 +11,9 @@ [compojure "1.6.1"] [hiccup "1.0.5"] [org.clojure/clojurescript "1.10.339"] - [metosin/reitit "0.1.4-SNAPSHOT"] - [metosin/reitit-schema "0.1.4-SNAPSHOT"] - [metosin/reitit-frontend "0.1.4-SNAPSHOT"] + [metosin/reitit "0.2.0-SNAPSHOT"] + [metosin/reitit-schema "0.2.0-SNAPSHOT"] + [metosin/reitit-frontend "0.2.0-SNAPSHOT"] ;; Just for pretty printting the match [fipp "0.6.12"]] diff --git a/examples/just-coercion-with-ring/project.clj b/examples/just-coercion-with-ring/project.clj index a1b18270..f9e6aed8 100644 --- a/examples/just-coercion-with-ring/project.clj +++ b/examples/just-coercion-with-ring/project.clj @@ -3,4 +3,4 @@ :dependencies [[org.clojure/clojure "1.9.0"] [ring "1.6.3"] [metosin/muuntaja "0.4.1"] - [metosin/reitit "0.1.4-SNAPSHOT"]]) + [metosin/reitit "0.2.0-SNAPSHOT"]]) diff --git a/examples/ring-example/project.clj b/examples/ring-example/project.clj index 25091829..670b8b0a 100644 --- a/examples/ring-example/project.clj +++ b/examples/ring-example/project.clj @@ -3,4 +3,4 @@ :dependencies [[org.clojure/clojure "1.9.0"] [ring "1.6.3"] [metosin/muuntaja "0.4.1"] - [metosin/reitit "0.1.4-SNAPSHOT"]]) + [metosin/reitit "0.2.0-SNAPSHOT"]]) diff --git a/examples/ring-swagger/project.clj b/examples/ring-swagger/project.clj index 76887394..c4fd112d 100644 --- a/examples/ring-swagger/project.clj +++ b/examples/ring-swagger/project.clj @@ -3,5 +3,5 @@ :dependencies [[org.clojure/clojure "1.9.0"] [ring "1.6.3"] [metosin/muuntaja "0.5.0"] - [metosin/reitit "0.1.4-SNAPSHOT"]] + [metosin/reitit "0.2.0-SNAPSHOT"]] :repl-options {:init-ns example.server}) diff --git a/modules/reitit-core/project.clj b/modules/reitit-core/project.clj index fe168dc8..622818a3 100644 --- a/modules/reitit-core/project.clj +++ b/modules/reitit-core/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-core "0.1.4-SNAPSHOT" +(defproject metosin/reitit-core "0.2.0-SNAPSHOT" :description "Snappy data-driven router for Clojure(Script)" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-frontend/project.clj b/modules/reitit-frontend/project.clj index 2d5b0034..c999ba2d 100644 --- a/modules/reitit-frontend/project.clj +++ b/modules/reitit-frontend/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-frontend "0.1.4-SNAPSHOT" +(defproject metosin/reitit-frontend "0.2.0-SNAPSHOT" :description "Reitit: Clojurescript frontend routing core" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-ring/project.clj b/modules/reitit-ring/project.clj index ee10b9c1..3b5e4cf7 100644 --- a/modules/reitit-ring/project.clj +++ b/modules/reitit-ring/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-ring "0.1.4-SNAPSHOT" +(defproject metosin/reitit-ring "0.2.0-SNAPSHOT" :description "Reitit: Ring routing" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-schema/project.clj b/modules/reitit-schema/project.clj index 61652645..b369a293 100644 --- a/modules/reitit-schema/project.clj +++ b/modules/reitit-schema/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-schema "0.1.4-SNAPSHOT" +(defproject metosin/reitit-schema "0.2.0-SNAPSHOT" :description "Reitit: Plumatic Schema coercion" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-spec/project.clj b/modules/reitit-spec/project.clj index eeb7e735..86745680 100644 --- a/modules/reitit-spec/project.clj +++ b/modules/reitit-spec/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-spec "0.1.4-SNAPSHOT" +(defproject metosin/reitit-spec "0.2.0-SNAPSHOT" :description "Reitit: clojure.spec coercion" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-swagger-ui/project.clj b/modules/reitit-swagger-ui/project.clj index b9903351..0e189fbc 100644 --- a/modules/reitit-swagger-ui/project.clj +++ b/modules/reitit-swagger-ui/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-swagger-ui "0.1.4-SNAPSHOT" +(defproject metosin/reitit-swagger-ui "0.2.0-SNAPSHOT" :description "Reitit: Swagger-ui support" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit-swagger/project.clj b/modules/reitit-swagger/project.clj index 6522fac6..32a7bdcd 100644 --- a/modules/reitit-swagger/project.clj +++ b/modules/reitit-swagger/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-swagger "0.1.4-SNAPSHOT" +(defproject metosin/reitit-swagger "0.2.0-SNAPSHOT" :description "Reitit: Swagger-support" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/modules/reitit/project.clj b/modules/reitit/project.clj index 176b6f89..b0b8bcfa 100644 --- a/modules/reitit/project.clj +++ b/modules/reitit/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit "0.1.4-SNAPSHOT" +(defproject metosin/reitit "0.2.0-SNAPSHOT" :description "Snappy data-driven router for Clojure(Script)" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" diff --git a/project.clj b/project.clj index 783f9a81..c67701a3 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject metosin/reitit-parent "0.1.4-SNAPSHOT" +(defproject metosin/reitit-parent "0.2.0-SNAPSHOT" :description "Snappy data-driven router for Clojure(Script)" :url "https://github.com/metosin/reitit" :license {:name "Eclipse Public License" @@ -9,14 +9,14 @@ :source-uri "https://github.com/metosin/reitit/{version}/{filepath}#L{line}" :metadata {:doc/format :markdown}} - :managed-dependencies [[metosin/reitit "0.1.4-SNAPSHOT"] - [metosin/reitit-core "0.1.4-SNAPSHOT"] - [metosin/reitit-ring "0.1.4-SNAPSHOT"] - [metosin/reitit-spec "0.1.4-SNAPSHOT"] - [metosin/reitit-schema "0.1.4-SNAPSHOT"] - [metosin/reitit-swagger "0.1.4-SNAPSHOT"] - [metosin/reitit-swagger-ui "0.1.4-SNAPSHOT"] - [metosin/reitit-frontend "0.1.4-SNAPSHOT"] + :managed-dependencies [[metosin/reitit "0.2.0-SNAPSHOT"] + [metosin/reitit-core "0.2.0-SNAPSHOT"] + [metosin/reitit-ring "0.2.0-SNAPSHOT"] + [metosin/reitit-spec "0.2.0-SNAPSHOT"] + [metosin/reitit-schema "0.2.0-SNAPSHOT"] + [metosin/reitit-swagger "0.2.0-SNAPSHOT"] + [metosin/reitit-swagger-ui "0.2.0-SNAPSHOT"] + [metosin/reitit-frontend "0.2.0-SNAPSHOT"] [meta-merge "1.0.0"] [ring/ring-core "1.6.3"] From 0b4d1d2ee1fee4f415f17cd83edd584fbd75d478 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Wed, 1 Aug 2018 18:05:14 +0300 Subject: [PATCH 18/55] url-encode & url-decode --- modules/reitit-core/src/reitit/impl.cljc | 39 ++++++-- perf-test/clj/reitit/impl_perf_test.clj | 116 +++++++++++++++++++++++ test/cljc/reitit/impl_test.cljc | 93 ++++++++++++++++++ 3 files changed, 241 insertions(+), 7 deletions(-) create mode 100644 perf-test/clj/reitit/impl_perf_test.clj diff --git a/modules/reitit-core/src/reitit/impl.cljc b/modules/reitit-core/src/reitit/impl.cljc index d5a41969..2d74dce2 100644 --- a/modules/reitit-core/src/reitit/impl.cljc +++ b/modules/reitit-core/src/reitit/impl.cljc @@ -166,15 +166,40 @@ ;; Path-parameters, see https://github.com/metosin/reitit/issues/75 ;; +#?(:clj + (def hex-digit + {0 "0" 1 "1" 2 "2" 3 "3" + 4 "4" 5 "5" 6 "6" 7 "7" + 8 "8" 9 "9" 10 "A" 11 "B" + 12 "C" 13 "D" 14 "E" 15 "F"})) + +#?(:clj + (defn byte->percent [byte] + (let [byte (bit-and 0xFF byte) + low-nibble (bit-and 0xF byte) + high-nibble (bit-shift-right byte 4)] + (str "%" (hex-digit high-nibble) (hex-digit low-nibble))))) + +#?(:clj + (defn percent-encode [^String unencoded] + (->> (.getBytes unencoded "UTF-8") (map byte->percent) (str/join)))) + +;; + is safe, but removed so it would work the same as with js (defn url-encode [s] - (some-> s - #?(:clj (URLEncoder/encode "UTF-8") - :cljs (js/encodeURIComponent)) - #?(:clj (.replace "+" "%20")))) + (if s + #?(:clj (str/replace s #"[^A-Za-z0-9\!'\(\)\*_~.-]+" percent-encode) + :cljs (js/encodeURIComponent s)))) (defn url-decode [s] - (some-> s #?(:clj (URLDecoder/decode "UTF-8") - :cljs (js/decodeURIComponent)))) + (if s + #?(:clj (if (.contains ^String s "%") + (URLDecoder/decode + (if (.contains ^String s "+") + (.replace ^String s "+" "%2B") + s) + "UTF-8") + s) + :cljs (js/decodeURIComponent s)))) (defprotocol IntoString (into-string [_])) @@ -203,7 +228,7 @@ (into-string [this] (str this)) nil - (into-string [this])) + (into-string [_])) (defn path-params "shallow transform of the path parameters values into strings" diff --git a/perf-test/clj/reitit/impl_perf_test.clj b/perf-test/clj/reitit/impl_perf_test.clj new file mode 100644 index 00000000..20b28d6c --- /dev/null +++ b/perf-test/clj/reitit/impl_perf_test.clj @@ -0,0 +1,116 @@ +(ns reitit.impl-perf-test + (:require [criterium.core :as cc] + [reitit.perf-utils :refer :all] + [ring.util.codec] + [reitit.impl]) + (:import (java.net URLDecoder URLEncoder))) + +;; +;; start repl with `lein perf repl` +;; perf measured with the following setup: +;; +;; Model Name: MacBook Pro +;; Model Identifier: MacBookPro11,3 +;; Processor Name: Intel Core i7 +;; Processor Speed: 2,5 GHz +;; Number of Processors: 1 +;; Total Number of Cores: 4 +;; L2 Cache (per Core): 256 KB +;; L3 Cache: 6 MB +;; Memory: 16 GB +;; + + +(defn test! [f input] + (do + (println "\u001B[33m") + (println (pr-str input) "=>" (pr-str (f input))) + (println "\u001B[0m") + (cc/quick-bench (f input)))) + +(defn url-decode-naive [s] + (URLDecoder/decode + (.replace ^String s "+" "%2B") + "UTF-8")) + +(defn decode! [] + + ;; ring + + ;; 890ns + ;; 190ns + ;; 90ns + ;; 80ns + + ;; naive + + ;; 750ns + ;; 340ns + ;; 420ns + ;; 200ns + + ;; reitit + + ;; 630ns (-29%) + ;; 12ns (-94%) + ;; 8ns (-91%) + ;; 8ns (-90%) + + (doseq [fs ['ring.util.codec/url-decode + 'url-decode-naive + 'reitit.impl/url-decode] + :let [f (deref (resolve fs))]] + (suite (str fs)) + (doseq [s ["aja%20hiljaa+sillalla" + "aja_hiljaa_sillalla" + "1+1" + "1"]] + (test! f s)))) + +(defn url-encode-naive [^String s] + (cond-> (.replace (URLEncoder/encode s "UTF-8") "+" "%20") + (.contains s "+") (.replace "%2B" "+") + (.contains s "~") (.replace "%7E" "~") + (.contains s "=") (.replace "%3D" "=") + (.contains s "!") (.replace "%21" "!") + (.contains s "'") (.replace "%27" "'") + (.contains s "(") (.replace "%28" "(") + (.contains s ")") (.replace "%29" ")"))) + +(defn encode! [] + + ;; ring + + ;; 2500ns + ;; 610ns + ;; 160ns + ;; 120ns + + ;; naive + + ;; 1000ns + ;; 440ns + ;; 570ns + ;; 200ns + + ;; reitit + + ;; 1400ns + ;; 740ns + ;; 180ns + ;; 130ns + + (doseq [fs ['ring.util.codec/url-encode + 'url-encode-naive + 'reitit.impl/url-encode] + :let [f (deref (resolve fs))]] + (suite (str fs)) + (doseq [s ["aja hiljaa+sillalla" + "aja_hiljaa_sillalla" + "1+1" + "1"]] + (test! f s)))) + +(comment + (decode!) + (encode!)) diff --git a/test/cljc/reitit/impl_test.cljc b/test/cljc/reitit/impl_test.cljc index 1d437ed8..782a3435 100644 --- a/test/cljc/reitit/impl_test.cljc +++ b/test/cljc/reitit/impl_test.cljc @@ -64,3 +64,96 @@ ;{:a ["c" "b"]} "a=c&a=b" ;{:a (seq [1 2])} "a=1&a=2" ;{:a #{"c" "b"}} "a=b&a=c" + +(deftest url-encode-test + (are [in out] + (= out (impl/url-encode in)) + + "/" "%2F" + "?" "%3F" + "#" "%23" + "[" "%5B" + "]" "%5D" + "!" "!" + #_#_"$" "$" + #_#_"&" "&" + "'" "'" + "(" "(" + ")" ")" + "*" "*" + #_#_"+" "+" + #_#_"," "," + #_#_";" ";" + #_#_"=" "=" + #_#_":" ":" + #_#_"@" "@" + "a" "a" + "z" "z" + "A" "A" + "Z" "Z" + "0" "0" + "9" "9" + "-" "-" + "." "." + "_" "_" + "~" "~" + "\000" "%00" + "\037" "%1F" + " " "%20" + "\"" "%22" + "%" "%25" + "<" "%3C" + ">" "%3E" + "\\" "%5C" + "^" "%5E" + "`" "%60" + "{" "%7B" + "|" "%7C" + "}" "%7D" + "\177" "%7F" + #_#_"\377" "%FF" + + "£0.25" "%C2%A30.25" + "€100" "%E2%82%AC100" + "«küßî»" "%C2%ABk%C3%BC%C3%9F%C3%AE%C2%BB" + "“ЌύБЇ”" "%E2%80%9C%D0%8C%CF%8D%D0%91%D0%87%E2%80%9D" + + "\000" "%00" + #_#_"\231" "%99" + #_#_"\252" "%AA" + #_#_"\377" "%FF" + + "" "" + "1" "1" + "12" "12" + "123" "123" + "1234567890" "1234567890" + + "Hello world" "Hello%20world" + "/home/foo" "%2Fhome%2Ffoo" + + " " "%20" + "+" "%2B" #_"+" + " +" "%20%2B" #_"%20+" + #_#_"1+2=3" "1+2=3" + #_#_"1 + 2 = 3" "1%20+%202%20=%203")) + +(deftest url-decode-test + (are [in out] + (= out (impl/url-decode in)) + + "1+1" "1+1" + "%21" "!" + "%61" "a" + "%31%32%33" "123" + "%2b" "+" + "%7e" "~" + "hello%20world" "hello world" + "a%2fb" "a/b" + "a/.." "a/.." + "a/." "a/." + "//a" "//a" + "a//b" "a//b" + "a//" "a//" + "/path/%C2%ABk%C3%BC%C3%9F%C3%AE%C2%BB" "/path/«küßî»" + "/path/%E2%80%9C%D0%8C%CF%8D%D0%91%D0%87%E2%80%9D" "/path/“ЌύБЇ”")) From 303b12497312fd1818e5727f1e4e32d5aa89dd51 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Wed, 1 Aug 2018 18:56:58 +0300 Subject: [PATCH 19/55] format --- modules/reitit-core/src/reitit/impl.cljc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/reitit-core/src/reitit/impl.cljc b/modules/reitit-core/src/reitit/impl.cljc index 2d74dce2..0ade6c7e 100644 --- a/modules/reitit-core/src/reitit/impl.cljc +++ b/modules/reitit-core/src/reitit/impl.cljc @@ -256,7 +256,7 @@ (goog/inherits ~type ~base-type) ~@(map - (fn [method] - `(set! (.. ~type -prototype ~(symbol (str "-" (first method)))) - (fn ~@(rest method)))) - methods))) + (fn [method] + `(set! (.. ~type -prototype ~(symbol (str "-" (first method)))) + (fn ~@(rest method)))) + methods))) From 6c23a5562a1fa3dbb4d5dd801b3a615f077c108c Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Wed, 1 Aug 2018 18:57:17 +0300 Subject: [PATCH 20/55] form-encode & form-decode --- modules/reitit-core/src/reitit/impl.cljc | 17 +++++++++++++++++ test/cljc/reitit/impl_test.cljc | 12 ++++++++++++ 2 files changed, 29 insertions(+) diff --git a/modules/reitit-core/src/reitit/impl.cljc b/modules/reitit-core/src/reitit/impl.cljc index 0ade6c7e..e4426600 100644 --- a/modules/reitit-core/src/reitit/impl.cljc +++ b/modules/reitit-core/src/reitit/impl.cljc @@ -201,6 +201,23 @@ s) :cljs (js/decodeURIComponent s)))) +(defn form-encode [s] + (if s + #?(:clj (-> s + (str/replace #"[^A-Za-z0-9\!'\(\)\*_~.-\\\ ]+" percent-encode) + (^String .replace " " "+")) + :cljs (str/replace (js/encodeURIComponent s) "%20" "+")))) + +(defn form-decode [s] + (if s + #?(:clj (let [s (if (.contains ^String s "+") + (.replace ^String s "+" " ") + s)] + (if (.contains ^String s "%") + (URLDecoder/decode s "UTF-8") + s)) + :cljs (js/decodeURIComponent (str/replace s "+" " "))))) + (defprotocol IntoString (into-string [_])) diff --git a/test/cljc/reitit/impl_test.cljc b/test/cljc/reitit/impl_test.cljc index 782a3435..85526eb4 100644 --- a/test/cljc/reitit/impl_test.cljc +++ b/test/cljc/reitit/impl_test.cljc @@ -157,3 +157,15 @@ "a//" "a//" "/path/%C2%ABk%C3%BC%C3%9F%C3%AE%C2%BB" "/path/«küßî»" "/path/%E2%80%9C%D0%8C%CF%8D%D0%91%D0%87%E2%80%9D" "/path/“ЌύБЇ”")) + +(deftest form-encode-test + (are [in out] + (= out (impl/form-encode in)) + + "+632 905 123 4567" "%2B632+905+123+4567")) + +(deftest form-decode-test + (are [in out] + (= out (impl/form-decode in)) + + "%2B632+905+123+4567" "+632 905 123 4567")) From 682dd0556874c0846849055ca8c5d14c5ffab66c Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Wed, 1 Aug 2018 19:28:52 +0300 Subject: [PATCH 21/55] tune perf --- modules/reitit-core/src/reitit/impl.cljc | 13 ++--- perf-test/clj/reitit/impl_perf_test.clj | 64 ++++++++++++++++++++++-- 2 files changed, 64 insertions(+), 13 deletions(-) diff --git a/modules/reitit-core/src/reitit/impl.cljc b/modules/reitit-core/src/reitit/impl.cljc index e4426600..ccad2761 100644 --- a/modules/reitit-core/src/reitit/impl.cljc +++ b/modules/reitit-core/src/reitit/impl.cljc @@ -203,19 +203,14 @@ (defn form-encode [s] (if s - #?(:clj (-> s - (str/replace #"[^A-Za-z0-9\!'\(\)\*_~.-\\\ ]+" percent-encode) - (^String .replace " " "+")) + #?(:clj (URLEncoder/encode ^String s "UTF-8") :cljs (str/replace (js/encodeURIComponent s) "%20" "+")))) (defn form-decode [s] (if s - #?(:clj (let [s (if (.contains ^String s "+") - (.replace ^String s "+" " ") - s)] - (if (.contains ^String s "%") - (URLDecoder/decode s "UTF-8") - s)) + #?(:clj (if (or (.contains ^String s "%") (.contains ^String s "+")) + (URLDecoder/decode ^String s "UTF-8") + s) :cljs (js/decodeURIComponent (str/replace s "+" " "))))) (defprotocol IntoString diff --git a/perf-test/clj/reitit/impl_perf_test.clj b/perf-test/clj/reitit/impl_perf_test.clj index 20b28d6c..65f54b04 100644 --- a/perf-test/clj/reitit/impl_perf_test.clj +++ b/perf-test/clj/reitit/impl_perf_test.clj @@ -33,7 +33,7 @@ (.replace ^String s "+" "%2B") "UTF-8")) -(defn decode! [] +(defn url-decode! [] ;; ring @@ -77,7 +77,7 @@ (.contains s "(") (.replace "%28" "(") (.contains s ")") (.replace "%29" ")"))) -(defn encode! [] +(defn url-encode! [] ;; ring @@ -111,6 +111,62 @@ "1"]] (test! f s)))) +(defn form-decode! [] + + ;; ring + + ;; 280ns + ;; 130ns + ;; 43ns + ;; 25ns + + ;; reitit + + ;; 270ns (-4%) + ;; 20ns (-84%) + ;; 47ns (+8%) + ;; 12ns (-52%) + + (doseq [fs ['ring.util.codec/form-decode-str + 'reitit.impl/form-decode] + :let [f (deref (resolve fs))]] + (suite (str fs)) + (doseq [s ["%2Baja%20hiljaa+sillalla" + "aja_hiljaa_sillalla" + "1+1" + "1"]] + (test! f s)))) + +(defn form-encode! [] + + ;; ring + + ;; 240ns + ;; 120ns + ;; 130ns + ;; 31ns + + ;; reitit + + ;; 210ns + ;; 120ns + ;; 130ns + ;; 30ns + + (doseq [fs ['ring.util.codec/form-encode + 'reitit.impl/form-encode] + :let [f (deref (resolve fs))]] + (suite (str fs)) + (doseq [s ["aja hiljaa+sillalla" + "aja_hiljaa_sillalla" + "1+1" + "1"]] + (test! f s)))) + (comment - (decode!) - (encode!)) + (url-decode!) + (url-encode!) + (form-decode!) + (form-encode!)) + +(ring.util.codec/form-decode-str "%2B632+905+123+4567") From 077a1887cb7162e397568f062160d428cccf2c09 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Wed, 1 Aug 2018 19:38:16 +0300 Subject: [PATCH 22/55] CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 560e5910..377db133 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ * **BREAKING**: the router option key to extract body format has been renamed: `:extract-request-format` => `:reitit.coercion/extract-request-format` * should only concern you if you are not using [Muuntaja](https://github.com/metosin/muuntaja). * the `r/routes` returns just the path + data tuples as documented, not the compiled route results. To get the compiled results, use `r/compiled-routes` instead. +* new [faster](https://github.com/metosin/reitit/blob/master/perf-test/clj/reitit/impl_perf_test.clj) and more correct encoders and decoders for query & path params. * welcome route name conflict resolution! If router has routes with same names, router can't be created. fix 'em. * sequential child routes are allowed, enabling this: From bf3fb64088c08542552586f2b864522d8b410bda Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Wed, 1 Aug 2018 19:43:58 +0300 Subject: [PATCH 23/55] query is a form-param --- modules/reitit-core/src/reitit/impl.cljc | 4 ++-- test/cljc/reitit/impl_test.cljc | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/reitit-core/src/reitit/impl.cljc b/modules/reitit-core/src/reitit/impl.cljc index ccad2761..58fb67e6 100644 --- a/modules/reitit-core/src/reitit/impl.cljc +++ b/modules/reitit-core/src/reitit/impl.cljc @@ -256,9 +256,9 @@ [params] (->> params (map (fn [[k v]] - (str (url-encode (into-string k)) + (str (form-encode (into-string k)) "=" - (url-encode (into-string v))))) + (form-encode (into-string v))))) (str/join "&"))) (defmacro goog-extend [type base-type ctor & methods] diff --git a/test/cljc/reitit/impl_test.cljc b/test/cljc/reitit/impl_test.cljc index 85526eb4..1842d358 100644 --- a/test/cljc/reitit/impl_test.cljc +++ b/test/cljc/reitit/impl_test.cljc @@ -57,7 +57,7 @@ {:a 1} "a=1" {:a nil} "a=" {:a :b :c "d"} "a=b&c=d" - {:a "b c"} "a=b%20c")) + {:a "b c"} "a=b+c")) ; TODO: support seq values? ;{:a ["b" "c"]} "a=b&a=c" From ebecb7ee12ffa38f2b1f0f77b2f3d61379a90e25 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Wed, 1 Aug 2018 19:46:47 +0300 Subject: [PATCH 24/55] update readme --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 377db133..e00a3410 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ * should only concern you if you are not using [Muuntaja](https://github.com/metosin/muuntaja). * the `r/routes` returns just the path + data tuples as documented, not the compiled route results. To get the compiled results, use `r/compiled-routes` instead. * new [faster](https://github.com/metosin/reitit/blob/master/perf-test/clj/reitit/impl_perf_test.clj) and more correct encoders and decoders for query & path params. + * query-parameters are encoded with `reitit.impl/form-encode`, so spaces are `+` instead of `%20`. * welcome route name conflict resolution! If router has routes with same names, router can't be created. fix 'em. * sequential child routes are allowed, enabling this: From 7389838b5953f774b424b8b31100619b5dd26d5a Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Wed, 1 Aug 2018 19:51:54 +0300 Subject: [PATCH 25/55] mention sources --- modules/reitit-core/src/reitit/impl.cljc | 6 +++++- test/cljc/reitit/impl_test.cljc | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/reitit-core/src/reitit/impl.cljc b/modules/reitit-core/src/reitit/impl.cljc index 58fb67e6..35a13737 100644 --- a/modules/reitit-core/src/reitit/impl.cljc +++ b/modules/reitit-core/src/reitit/impl.cljc @@ -163,7 +163,7 @@ (->> m (remove (comp nil? second)) (into {}))) ;; -;; Path-parameters, see https://github.com/metosin/reitit/issues/75 +;; Parts (c) https://github.com/lambdaisland/uri/tree/master/src/lambdaisland/uri ;; #?(:clj @@ -184,6 +184,10 @@ (defn percent-encode [^String unencoded] (->> (.getBytes unencoded "UTF-8") (map byte->percent) (str/join)))) +;; +;; encoding & decoding +;; + ;; + is safe, but removed so it would work the same as with js (defn url-encode [s] (if s diff --git a/test/cljc/reitit/impl_test.cljc b/test/cljc/reitit/impl_test.cljc index 1842d358..d7286d60 100644 --- a/test/cljc/reitit/impl_test.cljc +++ b/test/cljc/reitit/impl_test.cljc @@ -65,6 +65,8 @@ ;{:a (seq [1 2])} "a=1&a=2" ;{:a #{"c" "b"}} "a=b&a=c" +;; test from https://github.com/playframework/playframework -> UriEncodingSpec.scala + (deftest url-encode-test (are [in out] (= out (impl/url-encode in)) From 230717ba65a537ed8cf60ad27bcc1ff905b85a46 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Thu, 2 Aug 2018 16:06:34 +0300 Subject: [PATCH 26/55] double fast byte formatting --- modules/reitit-core/src/reitit/impl.cljc | 24 +++++------------------- perf-test/clj/reitit/impl_perf_test.clj | 2 -- 2 files changed, 5 insertions(+), 21 deletions(-) diff --git a/modules/reitit-core/src/reitit/impl.cljc b/modules/reitit-core/src/reitit/impl.cljc index 35a13737..27f9fa1e 100644 --- a/modules/reitit-core/src/reitit/impl.cljc +++ b/modules/reitit-core/src/reitit/impl.cljc @@ -162,27 +162,13 @@ (defn strip-nils [m] (->> m (remove (comp nil? second)) (into {}))) -;; -;; Parts (c) https://github.com/lambdaisland/uri/tree/master/src/lambdaisland/uri -;; +#?(:clj (def +percents+ (into [] (map #(format "%%%02X" %) (range 0 256))))) -#?(:clj - (def hex-digit - {0 "0" 1 "1" 2 "2" 3 "3" - 4 "4" 5 "5" 6 "6" 7 "7" - 8 "8" 9 "9" 10 "A" 11 "B" - 12 "C" 13 "D" 14 "E" 15 "F"})) +#?(:clj (defn byte->percent [byte] + (nth +percents+ (if (< byte 0) (+ 256 byte) byte)))) -#?(:clj - (defn byte->percent [byte] - (let [byte (bit-and 0xFF byte) - low-nibble (bit-and 0xF byte) - high-nibble (bit-shift-right byte 4)] - (str "%" (hex-digit high-nibble) (hex-digit low-nibble))))) - -#?(:clj - (defn percent-encode [^String unencoded] - (->> (.getBytes unencoded "UTF-8") (map byte->percent) (str/join)))) +#?(:clj (defn percent-encode [^String s] + (->> (.getBytes s "UTF-8") (map byte->percent) (str/join)))) ;; ;; encoding & decoding diff --git a/perf-test/clj/reitit/impl_perf_test.clj b/perf-test/clj/reitit/impl_perf_test.clj index 65f54b04..1add9f05 100644 --- a/perf-test/clj/reitit/impl_perf_test.clj +++ b/perf-test/clj/reitit/impl_perf_test.clj @@ -168,5 +168,3 @@ (url-encode!) (form-decode!) (form-encode!)) - -(ring.util.codec/form-decode-str "%2B632+905+123+4567") From 10ccbb72e32bb380465fc069e6686aa1848e63b1 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Tue, 17 Jul 2018 16:47:22 +0300 Subject: [PATCH 27/55] wip --- examples/ring-swagger/project.clj | 1 - examples/ring-swagger/src/example/server.clj | 15 ++-- modules/reitit-middleware/project.clj | 10 +++ .../ring/middleware/alpha/exception.cljc | 78 +++++++++++++++++++ .../ring/middleware/alpha/multipart.cljc | 34 ++++++++ .../ring/middleware/alpha/muuntaja.cljc | 17 ++++ modules/reitit/project.clj | 1 + project.clj | 6 +- scripts/lein-modules | 2 +- .../reitit/ring/middleware/muuntaja_test.clj | 18 +++++ 10 files changed, 168 insertions(+), 14 deletions(-) create mode 100644 modules/reitit-middleware/project.clj create mode 100644 modules/reitit-middleware/src/reitit/ring/middleware/alpha/exception.cljc create mode 100644 modules/reitit-middleware/src/reitit/ring/middleware/alpha/multipart.cljc create mode 100644 modules/reitit-middleware/src/reitit/ring/middleware/alpha/muuntaja.cljc create mode 100644 test/clj/reitit/ring/middleware/muuntaja_test.clj diff --git a/examples/ring-swagger/project.clj b/examples/ring-swagger/project.clj index c4fd112d..60f6406d 100644 --- a/examples/ring-swagger/project.clj +++ b/examples/ring-swagger/project.clj @@ -2,6 +2,5 @@ :description "Reitit Ring App with Swagger" :dependencies [[org.clojure/clojure "1.9.0"] [ring "1.6.3"] - [metosin/muuntaja "0.5.0"] [metosin/reitit "0.2.0-SNAPSHOT"]] :repl-options {:init-ns example.server}) diff --git a/examples/ring-swagger/src/example/server.clj b/examples/ring-swagger/src/example/server.clj index adb86200..c14eb283 100644 --- a/examples/ring-swagger/src/example/server.clj +++ b/examples/ring-swagger/src/example/server.clj @@ -5,11 +5,12 @@ [reitit.ring.coercion :as rrc] [reitit.coercion.spec :as spec] [reitit.coercion.schema :as schema] + [reitit.ring.middleware.alpha.muuntaja :as muuntaja] + [schema.core :refer [Int]] [ring.adapter.jetty :as jetty] - [ring.middleware.params] - [muuntaja.middleware])) + [ring.middleware.params])) (def app (ring/ring-handler @@ -58,17 +59,11 @@ :body {:total (+ x y)}})}}]]] {:data {:middleware [ring.middleware.params/wrap-params - muuntaja.middleware/wrap-format + (muuntaja/create-format-middleware) swagger/swagger-feature rrc/coerce-exceptions-middleware rrc/coerce-request-middleware - rrc/coerce-response-middleware] - :swagger {:produces #{"application/json" - "application/edn" - "application/transit+json"} - :consumes #{"application/json" - "application/edn" - "application/transit+json"}}}}) + rrc/coerce-response-middleware]}}) (ring/routes (swagger-ui/create-swagger-ui-handler {:path "/", :url "/api/swagger.json"}) diff --git a/modules/reitit-middleware/project.clj b/modules/reitit-middleware/project.clj new file mode 100644 index 00000000..8212153a --- /dev/null +++ b/modules/reitit-middleware/project.clj @@ -0,0 +1,10 @@ +(defproject metosin/reitit-middleware "0.2.0-SNAPSHOT" + :description "Reitit, common middleware bundled" + :url "https://github.com/metosin/reitit" + :license {:name "Eclipse Public License" + :url "http://www.eclipse.org/legal/epl-v10.html"} + :plugins [[lein-parent "0.3.2"]] + :parent-project {:path "../../project.clj" + :inherit [:deploy-repositories :managed-dependencies]} + :dependencies [[metosin/reitit-ring] + [metosin/muuntaja]]) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/alpha/exception.cljc b/modules/reitit-middleware/src/reitit/ring/middleware/alpha/exception.cljc new file mode 100644 index 00000000..b82d5276 --- /dev/null +++ b/modules/reitit-middleware/src/reitit/ring/middleware/alpha/exception.cljc @@ -0,0 +1,78 @@ +(ns reitit.ring.middleware.alpha.exception + (:require [reitit.coercion :as coercion] + [reitit.ring :as ring])) + +(defn- super-classes [^Class k] + (loop [sk (.getSuperclass k), ks []] + (if-not (= sk Object) + (recur (.getSuperclass sk) (conj ks sk)) + ks))) + +(defn- call-error-handler [default-handler handlers error request] + (let [{:keys [type] :as data} (ex-data error) + ex-class (class error) + error-handler (or (get handlers type) + (get handlers ex-class) + (some + (partial get handlers) + (super-classes ex-class)) + default-handler)] + (error-handler error data request))) + +(defn default-handler [^Exception e _ _] + {:status 500 + :body {:type "exception" + :class (.getName (.getClass e))}}) + +(defn coercion-handler [status] + (fn [_ data _] + {:status status + :body (coercion/encode-error data)})) + +(defn http-response-handler + "reads response from ex-data :response" + [_ {:keys [response]} _] + response) + +(defn request-parsing-handler [_ {:keys [format]} _] + {:status 400 + :headers {"Content-Type" "text/plain"} + :body (str "Malformed " format " request.")}) + +;; +;; public api +;; + +(def default-handlers + {::default default-handler + ::ring/response http-response-handler + :muuntaja/decode request-parsing-handler + ::coercion/request-coercion (coercion-handler 400) + ::coercion/response-coercion (coercion-handler 500)}) + +(defn create-exceptions-middleware + "Catches all exceptions and looks up a exception handler: + 1) `:type` of ex-data + 2) Class of Exception + 3) Super Classes of Exception + 4) The ::default handler" + ([] + (create-exceptions-middleware default-handlers)) + ([{:keys [handlers] :or {handlers default-handlers}}] + (let [default-handler (get handlers ::default default-handler) + on-exception (fn [e request respond raise] + (try + (respond (call-error-handler default-handler handlers e request)) + (catch Exception e + (raise e))))] + (fn + ([request] + (try + (handler request) + (catch Throwable e + (on-exception e request identity #(throw %))))) + ([request respond raise] + (try + (handler request respond (fn [e] (on-exception e request respond raise))) + (catch Throwable e + (on-exception e request respond raise)))))))) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/alpha/multipart.cljc b/modules/reitit-middleware/src/reitit/ring/middleware/alpha/multipart.cljc new file mode 100644 index 00000000..169294ea --- /dev/null +++ b/modules/reitit-middleware/src/reitit/ring/middleware/alpha/multipart.cljc @@ -0,0 +1,34 @@ +(ns reitit.ring.middleware.alpha.multipart + (:require [reitit.coercion :as coercion] + [ring.middleware.multipart-params :as multipart-params])) + +(defn multipart-params + "Creates a Middleware to handle the multipart params, based on + ring.middleware.multipart-params, taking same options. Mounts only + if endpoint has `[:parameters :multipart]` defined. Publishes coerced + parameters into `[:parameters :multipart]` under request." + ([] + (multipart-params nil)) + ([options] + (let [parameter-coercion {:multipart (coercion/->ParameterCoercion :multipart-params :string true true)} + coerced-request (fn [request coercers] + (if-let [coerced (if coercers (coercion/coerce-request coercers request))] + (update request :parameters merge coerced) + request))] + {:name ::multipart + :compile (fn [{:keys [parameters coercion]} opts] + (if-let [multipart (:multipart parameters)] + (let [opts (assoc opts ::coercion/parameter-coercion parameter-coercion) + coercers (if multipart (coercion/request-coercers coercion parameters opts))] + (fn [handler] + (fn + ([request] + (-> request + (multipart-params/multipart-params-request options) + (coerced-request coercers) + (handler))) + ([request respond raise] + (-> request + (multipart-params/multipart-params-request options) + (coerced-request coercers) + (handler respond raise))))))))}))) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/alpha/muuntaja.cljc b/modules/reitit-middleware/src/reitit/ring/middleware/alpha/muuntaja.cljc new file mode 100644 index 00000000..b45ba1ae --- /dev/null +++ b/modules/reitit-middleware/src/reitit/ring/middleware/alpha/muuntaja.cljc @@ -0,0 +1,17 @@ +(ns reitit.ring.middleware.alpha.muuntaja + (:require [muuntaja.core :as m] + [muuntaja.middleware])) + +(defn create-format-middleware + ([] + (create-format-middleware m/default-options)) + ([options] + {:name ::formats + :compile (fn [{:keys [muuntaja]} _] + (let [options (or muuntaja options)] + (if options + (let [m (m/create options)] + {:data {:swagger {:produces (m/encodes m) + :consumes (m/encodes m)}} + :wrap (fn [handler] + (muuntaja.middleware/wrap-format handler m))}))))})) diff --git a/modules/reitit/project.clj b/modules/reitit/project.clj index b0b8bcfa..0dba44f6 100644 --- a/modules/reitit/project.clj +++ b/modules/reitit/project.clj @@ -8,6 +8,7 @@ :inherit [:deploy-repositories :managed-dependencies]} :dependencies [[metosin/reitit-core] [metosin/reitit-ring] + [metosin/reitit-middleware] [metosin/reitit-spec] [metosin/reitit-schema] [metosin/reitit-swagger] diff --git a/project.clj b/project.clj index c67701a3..6a425083 100644 --- a/project.clj +++ b/project.clj @@ -12,17 +12,18 @@ :managed-dependencies [[metosin/reitit "0.2.0-SNAPSHOT"] [metosin/reitit-core "0.2.0-SNAPSHOT"] [metosin/reitit-ring "0.2.0-SNAPSHOT"] + [metosin/reitit-middleware "0.2.0-SNAPSHOT"] [metosin/reitit-spec "0.2.0-SNAPSHOT"] [metosin/reitit-schema "0.2.0-SNAPSHOT"] [metosin/reitit-swagger "0.2.0-SNAPSHOT"] [metosin/reitit-swagger-ui "0.2.0-SNAPSHOT"] [metosin/reitit-frontend "0.2.0-SNAPSHOT"] - [meta-merge "1.0.0"] [ring/ring-core "1.6.3"] [metosin/spec-tools "0.7.1"] [metosin/schema-tools "0.10.3"] [metosin/ring-swagger-ui "2.2.10"] + [metosin/muuntaja "0.6.0-alpha1"] [metosin/jsonista "0.2.1"]] :plugins [[jonase/eastwood "0.2.6"] @@ -38,6 +39,7 @@ :source-paths ["modules/reitit/src" "modules/reitit-core/src" "modules/reitit-ring/src" + "modules/reitit-middleware/src" "modules/reitit-spec/src" "modules/reitit-schema/src" "modules/reitit-swagger/src" @@ -55,7 +57,7 @@ [ring "1.6.3"] [ikitommi/immutant-web "3.0.0-alpha1"] - [metosin/muuntaja "0.6.0-SNAPSHOT"] + [metosin/muuntaja "0.6.0-alpha1"] [metosin/ring-swagger-ui "2.2.10"] [metosin/jsonista "0.2.1"] diff --git a/scripts/lein-modules b/scripts/lein-modules index fc3870d8..17eefffc 100755 --- a/scripts/lein-modules +++ b/scripts/lein-modules @@ -3,6 +3,6 @@ set -e # Modules -for ext in reitit-core reitit-ring reitit-spec reitit-schema reitit-swagger reitit-swagger-ui reitit-frontend reitit; do +for ext in reitit-core reitit-ring reitit-middleware reitit-spec reitit-schema reitit-swagger reitit-swagger-ui reitit-frontend reitit; do cd modules/$ext; lein "$@"; cd ../..; done diff --git a/test/clj/reitit/ring/middleware/muuntaja_test.clj b/test/clj/reitit/ring/middleware/muuntaja_test.clj new file mode 100644 index 00000000..521da94c --- /dev/null +++ b/test/clj/reitit/ring/middleware/muuntaja_test.clj @@ -0,0 +1,18 @@ +(ns reitit.ring.middleware.muuntaja-test + (:require [clojure.test :refer [deftest testing is]] + [reitit.ring :as ring] + [reitit.ring.middleware.alpha.muuntaja :as muuntaja] + [muuntaja.core :as m])) + +(deftest muuntaja-test + (let [data {:kikka "kukka"} + app (ring/ring-handler + (ring/router + ["/ping" {:get (constantly {:status 200, :body data})}] + {:data {:middleware [(muuntaja/create-format-middleware)]}}))] + (is (= data (->> {:request-method :get, :uri "/ping"} + (app) + :body + (m/decode m/instance "application/json")))))) + +;; TODO: test swagger! From b54ee1a86b071f0569ecb04d1e7dffec57162cff Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sat, 21 Jul 2018 14:51:47 +0300 Subject: [PATCH 28/55] read encodes and decodes from Muuntaja! --- .../ring/middleware/alpha/muuntaja.cljc | 2 +- .../reitit-swagger/src/reitit/swagger.cljc | 3 +- .../reitit/ring/middleware/muuntaja_test.clj | 70 ++++++++++++++++++- test/cljc/reitit/swagger_test.clj | 4 +- 4 files changed, 73 insertions(+), 6 deletions(-) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/alpha/muuntaja.cljc b/modules/reitit-middleware/src/reitit/ring/middleware/alpha/muuntaja.cljc index b45ba1ae..3cafdcd4 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/alpha/muuntaja.cljc +++ b/modules/reitit-middleware/src/reitit/ring/middleware/alpha/muuntaja.cljc @@ -12,6 +12,6 @@ (if options (let [m (m/create options)] {:data {:swagger {:produces (m/encodes m) - :consumes (m/encodes m)}} + :consumes (m/decodes m)}} :wrap (fn [handler] (muuntaja.middleware/wrap-format handler m))}))))})) diff --git a/modules/reitit-swagger/src/reitit/swagger.cljc b/modules/reitit-swagger/src/reitit/swagger.cljc index a5e6511d..dc2eca78 100644 --- a/modules/reitit-swagger/src/reitit/swagger.cljc +++ b/modules/reitit-swagger/src/reitit/swagger.cljc @@ -81,10 +81,11 @@ (merge {:swagger "2.0" :x-id ids})) accept-route #(-> % second :swagger :id (or ::default) ->set (set/intersection ids) seq) - transform-endpoint (fn [[method {{:keys [coercion no-doc swagger] :as data} :data}]] + transform-endpoint (fn [[method {{:keys [coercion no-doc swagger] :as data} :data middleware :middleware}]] (if (and data (not no-doc)) [method (meta-merge + (apply meta-merge (keep (comp :swagger :data) middleware)) (if coercion (coercion/-get-apidocs coercion :swagger data)) (select-keys data [:tags :summary :description]) diff --git a/test/clj/reitit/ring/middleware/muuntaja_test.clj b/test/clj/reitit/ring/middleware/muuntaja_test.clj index 521da94c..ecda573d 100644 --- a/test/clj/reitit/ring/middleware/muuntaja_test.clj +++ b/test/clj/reitit/ring/middleware/muuntaja_test.clj @@ -2,7 +2,9 @@ (:require [clojure.test :refer [deftest testing is]] [reitit.ring :as ring] [reitit.ring.middleware.alpha.muuntaja :as muuntaja] - [muuntaja.core :as m])) + [muuntaja.core :as m] + [reitit.swagger :as swagger] + [reitit.core :as r])) (deftest muuntaja-test (let [data {:kikka "kukka"} @@ -15,4 +17,68 @@ :body (m/decode m/instance "application/json")))))) -;; TODO: test swagger! +(deftest muuntaja-swagger-test + (let [with-defaults m/instance + no-edn-decode (m/create (-> m/default-options (update-in [:formats "application/edn"] dissoc :decoder))) + just-edn (m/create (-> m/default-options (m/select-formats ["application/edn"]))) + app (ring/ring-handler + (ring/router + [["/defaults" + {:get identity}] + ["/explicit-defaults" + {:muuntaja with-defaults + :get identity}] + ["/no-edn-decode" + {:muuntaja no-edn-decode + :get identity}] + ["/just-edn" + {:muuntaja just-edn + :get identity}] + ["/swagger.json" + {:get {:no-doc true + :handler (swagger/create-swagger-handler)}}]] + {:data {:middleware [(muuntaja/create-format-middleware)]}})) + spec (fn [path] + (let [path (keyword path)] + (-> {:request-method :get :uri "/swagger.json"} + (app) :body + (->> (m/decode m/instance "application/json")) + :paths path :get))) + produces (comp set :produces spec) + consumes (comp set :consumes spec)] + + (testing "with defaults" + (let [path "/defaults"] + (is (= #{"application/json" + "application/transit+msgpack" + "application/transit+json" + "application/edn"} + (produces path) + (consumes path))))) + + (testing "with explicit muuntaja defaults" + (let [path "/explicit-defaults"] + (is (= #{"application/json" + "application/transit+msgpack" + "application/transit+json" + "application/edn"} + (produces path) + (consumes path))))) + + (testing "without edn decode" + (let [path "/no-edn-decode"] + (is (= #{"application/json" + "application/transit+msgpack" + "application/transit+json" + "application/edn"} + (produces path))) + (is (= #{"application/json" + "application/transit+msgpack" + "application/transit+json"} + (consumes path))))) + + (testing "just edn" + (let [path "/just-edn"] + (is (= #{"application/edn"} + (produces path) + (consumes path))))))) diff --git a/test/cljc/reitit/swagger_test.clj b/test/cljc/reitit/swagger_test.clj index 7c563ec2..b29b9305 100644 --- a/test/cljc/reitit/swagger_test.clj +++ b/test/cljc/reitit/swagger_test.clj @@ -180,5 +180,5 @@ :handler (swagger/create-swagger-handler)}}]]))] (is (= ["/ping"] (spec-paths app "/swagger.json"))) (is (= #{::swagger/default} - (-> {:request-method :get :uri "/swagger.json"} - (app) :body :x-id))))) + (-> {:request-method :get :uri "/swagger.json"} + (app) :body :x-id))))) From ed385afe5a7a20ea6f2ef2a6ada1f2832a92cb36 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sat, 21 Jul 2018 14:59:20 +0300 Subject: [PATCH 29/55] add specs --- .../src/reitit/ring/middleware/alpha/muuntaja.cljc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/alpha/muuntaja.cljc b/modules/reitit-middleware/src/reitit/ring/middleware/alpha/muuntaja.cljc index 3cafdcd4..09736980 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/alpha/muuntaja.cljc +++ b/modules/reitit-middleware/src/reitit/ring/middleware/alpha/muuntaja.cljc @@ -1,12 +1,16 @@ (ns reitit.ring.middleware.alpha.muuntaja (:require [muuntaja.core :as m] - [muuntaja.middleware])) + [muuntaja.middleware] + [clojure.spec.alpha :as s])) + +(s/def ::muuntaja (partial instance? m/Muuntaja)) (defn create-format-middleware ([] (create-format-middleware m/default-options)) ([options] {:name ::formats + :spec (s/keys :opt-un [::muuntaja]) :compile (fn [{:keys [muuntaja]} _] (let [options (or muuntaja options)] (if options From fa639fc5308a242d37edbe556fa01363119e0ecc Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sat, 21 Jul 2018 16:32:43 +0300 Subject: [PATCH 30/55] -alpha --- examples/ring-swagger/src/example/server.clj | 2 +- .../src/reitit/ring/middleware/{alpha => }/exception.cljc | 2 +- .../src/reitit/ring/middleware/{alpha => }/multipart.cljc | 2 +- .../src/reitit/ring/middleware/{alpha => }/muuntaja.cljc | 2 +- test/clj/reitit/ring/middleware/muuntaja_test.clj | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename modules/reitit-middleware/src/reitit/ring/middleware/{alpha => }/exception.cljc (98%) rename modules/reitit-middleware/src/reitit/ring/middleware/{alpha => }/multipart.cljc (97%) rename modules/reitit-middleware/src/reitit/ring/middleware/{alpha => }/muuntaja.cljc (94%) diff --git a/examples/ring-swagger/src/example/server.clj b/examples/ring-swagger/src/example/server.clj index c14eb283..33223a64 100644 --- a/examples/ring-swagger/src/example/server.clj +++ b/examples/ring-swagger/src/example/server.clj @@ -5,7 +5,7 @@ [reitit.ring.coercion :as rrc] [reitit.coercion.spec :as spec] [reitit.coercion.schema :as schema] - [reitit.ring.middleware.alpha.muuntaja :as muuntaja] + [reitit.ring.middleware.muuntaja :as muuntaja] [schema.core :refer [Int]] diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/alpha/exception.cljc b/modules/reitit-middleware/src/reitit/ring/middleware/exception.cljc similarity index 98% rename from modules/reitit-middleware/src/reitit/ring/middleware/alpha/exception.cljc rename to modules/reitit-middleware/src/reitit/ring/middleware/exception.cljc index b82d5276..c42b7977 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/alpha/exception.cljc +++ b/modules/reitit-middleware/src/reitit/ring/middleware/exception.cljc @@ -1,4 +1,4 @@ -(ns reitit.ring.middleware.alpha.exception +(ns reitit.ring.middleware.exception (:require [reitit.coercion :as coercion] [reitit.ring :as ring])) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/alpha/multipart.cljc b/modules/reitit-middleware/src/reitit/ring/middleware/multipart.cljc similarity index 97% rename from modules/reitit-middleware/src/reitit/ring/middleware/alpha/multipart.cljc rename to modules/reitit-middleware/src/reitit/ring/middleware/multipart.cljc index 169294ea..a384f10e 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/alpha/multipart.cljc +++ b/modules/reitit-middleware/src/reitit/ring/middleware/multipart.cljc @@ -1,4 +1,4 @@ -(ns reitit.ring.middleware.alpha.multipart +(ns reitit.ring.middleware.multipart (:require [reitit.coercion :as coercion] [ring.middleware.multipart-params :as multipart-params])) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/alpha/muuntaja.cljc b/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.cljc similarity index 94% rename from modules/reitit-middleware/src/reitit/ring/middleware/alpha/muuntaja.cljc rename to modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.cljc index 09736980..8027b35e 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/alpha/muuntaja.cljc +++ b/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.cljc @@ -1,4 +1,4 @@ -(ns reitit.ring.middleware.alpha.muuntaja +(ns reitit.ring.middleware.muuntaja (:require [muuntaja.core :as m] [muuntaja.middleware] [clojure.spec.alpha :as s])) diff --git a/test/clj/reitit/ring/middleware/muuntaja_test.clj b/test/clj/reitit/ring/middleware/muuntaja_test.clj index ecda573d..6312726b 100644 --- a/test/clj/reitit/ring/middleware/muuntaja_test.clj +++ b/test/clj/reitit/ring/middleware/muuntaja_test.clj @@ -1,7 +1,7 @@ (ns reitit.ring.middleware.muuntaja-test (:require [clojure.test :refer [deftest testing is]] [reitit.ring :as ring] - [reitit.ring.middleware.alpha.muuntaja :as muuntaja] + [reitit.ring.middleware.muuntaja :as muuntaja] [muuntaja.core :as m] [reitit.swagger :as swagger] [reitit.core :as r])) From b5247367767adab72d583af673f233066431d2ac Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sat, 21 Jul 2018 16:33:53 +0300 Subject: [PATCH 31/55] clj only --- .../src/reitit/ring/middleware/{exception.cljc => exception.clj} | 0 .../src/reitit/ring/middleware/{multipart.cljc => multipart.clj} | 0 .../src/reitit/ring/middleware/{muuntaja.cljc => muuntaja.clj} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename modules/reitit-middleware/src/reitit/ring/middleware/{exception.cljc => exception.clj} (100%) rename modules/reitit-middleware/src/reitit/ring/middleware/{multipart.cljc => multipart.clj} (100%) rename modules/reitit-middleware/src/reitit/ring/middleware/{muuntaja.cljc => muuntaja.clj} (100%) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/exception.cljc b/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj similarity index 100% rename from modules/reitit-middleware/src/reitit/ring/middleware/exception.cljc rename to modules/reitit-middleware/src/reitit/ring/middleware/exception.clj diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/multipart.cljc b/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj similarity index 100% rename from modules/reitit-middleware/src/reitit/ring/middleware/multipart.cljc rename to modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.cljc b/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj similarity index 100% rename from modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.cljc rename to modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj From 805cb94d33e73f80b7bb8d63ee61f43fed78d326 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sun, 22 Jul 2018 14:35:59 +0300 Subject: [PATCH 32/55] exception middleware tests --- .../src/reitit/ring/middleware/exception.clj | 44 ++++---- .../reitit/ring/middleware/exception_test.clj | 100 ++++++++++++++++++ .../reitit/ring/middleware/muuntaja_test.clj | 3 +- 3 files changed, 126 insertions(+), 21 deletions(-) create mode 100644 test/clj/reitit/ring/middleware/exception_test.clj diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj b/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj index c42b7977..895f21ea 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj @@ -13,6 +13,9 @@ ex-class (class error) error-handler (or (get handlers type) (get handlers ex-class) + (some + (partial get handlers) + (descendants type)) (some (partial get handlers) (super-classes ex-class)) @@ -37,13 +40,13 @@ (defn request-parsing-handler [_ {:keys [format]} _] {:status 400 :headers {"Content-Type" "text/plain"} - :body (str "Malformed " format " request.")}) + :body (str "Malformed " (pr-str format) " request.")}) ;; ;; public api ;; -(def default-handlers +(def default-options {::default default-handler ::ring/response http-response-handler :muuntaja/decode request-parsing-handler @@ -54,25 +57,28 @@ "Catches all exceptions and looks up a exception handler: 1) `:type` of ex-data 2) Class of Exception - 3) Super Classes of Exception - 4) The ::default handler" + 3) descadents `:type` of ex-data + 4) Super Classes of Exception + 5) The ::default handler" ([] - (create-exceptions-middleware default-handlers)) - ([{:keys [handlers] :or {handlers default-handlers}}] - (let [default-handler (get handlers ::default default-handler) + (create-exceptions-middleware default-options)) + ([options] + (let [default-handler (get options ::default default-handler) on-exception (fn [e request respond raise] (try - (respond (call-error-handler default-handler handlers e request)) + (respond (call-error-handler default-handler options e request)) (catch Exception e (raise e))))] - (fn - ([request] - (try - (handler request) - (catch Throwable e - (on-exception e request identity #(throw %))))) - ([request respond raise] - (try - (handler request respond (fn [e] (on-exception e request respond raise))) - (catch Throwable e - (on-exception e request respond raise)))))))) + {:name ::exception + :wrap (fn [handler] + (fn + ([request] + (try + (handler request) + (catch Throwable e + (on-exception e request identity #(throw %))))) + ([request respond raise] + (try + (handler request respond (fn [e] (on-exception e request respond raise))) + (catch Throwable e + (on-exception e request respond raise))))))}))) diff --git a/test/clj/reitit/ring/middleware/exception_test.clj b/test/clj/reitit/ring/middleware/exception_test.clj new file mode 100644 index 00000000..fe7d6733 --- /dev/null +++ b/test/clj/reitit/ring/middleware/exception_test.clj @@ -0,0 +1,100 @@ +(ns reitit.ring.middleware.exception-test + (:require [clojure.test :refer [deftest testing is]] + [reitit.ring :as ring] + [reitit.ring.middleware.exception :as exception] + [reitit.coercion.spec] + [reitit.ring.coercion] + [muuntaja.core :as m]) + (:import (java.sql SQLException SQLWarning))) + +(derive ::kikka ::kukka) + +(deftest exception-test + (letfn [(create [f] + (ring/ring-handler + (ring/router + [["/defaults" + {:handler f}] + ["/coercion" + {:middleware [reitit.ring.coercion/coerce-request-middleware + reitit.ring.coercion/coerce-response-middleware] + :coercion reitit.coercion.spec/coercion + :parameters {:query {:x int?, :y int?}} + :responses {200 {:body {:total pos-int?}}} + :handler f}]] + {:data {:middleware [(exception/create-exceptions-middleware + (merge + exception/default-options + {::kikka (constantly {:status 200, :body "kikka"}) + SQLException (constantly {:status 200, :body "sql"})}))]}})))] + + (testing "normal calls work ok" + (let [response {:status 200, :body "ok"} + app (create (fn [_] response))] + (is (= response (app {:request-method :get, :uri "/defaults"}))))) + + (testing "unknown exception" + (let [app (create (fn [_] (throw (NullPointerException.))))] + (is (= {:status 500 + :body {:type "exception" + :class "java.lang.NullPointerException"}} + (app {:request-method :get, :uri "/defaults"})))) + (let [app (create (fn [_] (throw (ex-info "fail" {:type ::invalid}))))] + (is (= {:status 500 + :body {:type "exception" + :class "clojure.lang.ExceptionInfo"}} + (app {:request-method :get, :uri "/defaults"}))))) + + (testing "::ring/response" + (let [response {:status 200, :body "ok"} + app (create (fn [_] (throw (ex-info "fail" {:type ::ring/response, :response response}))))] + (is (= response (app {:request-method :get, :uri "/defaults"}))))) + + (testing ":muuntaja/decode" + (let [app (create (fn [_] (m/decode m/instance "application/json" "{:so \"invalid\"}")))] + (is (= {:body "Malformed \"application/json\" request." + :headers {"Content-Type" "text/plain"} + :status 400} + (app {:request-method :get, :uri "/defaults"})))) + + (testing "::coercion/request-coercion" + (let [app (create (fn [{{{:keys [x y]} :query} :parameters}] + {:status 200, :body {:total (+ x y)}}))] + + (let [{:keys [status body]} (app {:request-method :get + :uri "/coercion" + :query-params {"x" "1", "y" "2"}})] + (is (= 200 status)) + (is (= {:total 3} body))) + + (let [{:keys [status body]} (app {:request-method :get + :uri "/coercion" + :query-params {"x" "abba", "y" "2"}})] + (is (= 400 status)) + (is (= :reitit.coercion/request-coercion (:type body)))) + + (let [{:keys [status body]} (app {:request-method :get + :uri "/coercion" + :query-params {"x" "-10", "y" "2"}})] + (is (= 500 status)) + (is (= :reitit.coercion/response-coercion (:type body))))))) + + (testing "exact :type" + (let [app (create (fn [_] (throw (ex-info "fail" {:type ::kikka}))))] + (is (= {:status 200, :body "kikka"} + (app {:request-method :get, :uri "/defaults"}))))) + + (testing "parent :type" + (let [app (create (fn [_] (throw (ex-info "fail" {:type ::kukka}))))] + (is (= {:status 200, :body "kikka"} + (app {:request-method :get, :uri "/defaults"}))))) + + (testing "exact Exception" + (let [app (create (fn [_] (throw (SQLException.))))] + (is (= {:status 200, :body "sql"} + (app {:request-method :get, :uri "/defaults"}))))) + + (testing "Exception SuperClass" + (let [app (create (fn [_] (throw (SQLWarning.))))] + (is (= {:status 200, :body "sql"} + (app {:request-method :get, :uri "/defaults"}))))))) diff --git a/test/clj/reitit/ring/middleware/muuntaja_test.clj b/test/clj/reitit/ring/middleware/muuntaja_test.clj index 6312726b..b9b5b6b1 100644 --- a/test/clj/reitit/ring/middleware/muuntaja_test.clj +++ b/test/clj/reitit/ring/middleware/muuntaja_test.clj @@ -2,9 +2,8 @@ (:require [clojure.test :refer [deftest testing is]] [reitit.ring :as ring] [reitit.ring.middleware.muuntaja :as muuntaja] - [muuntaja.core :as m] [reitit.swagger :as swagger] - [reitit.core :as r])) + [muuntaja.core :as m])) (deftest muuntaja-test (let [data {:kikka "kukka"} From 5c0cf19ef1f1524fd308d4bb86285ce16f9e9fd7 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sun, 22 Jul 2018 14:40:54 +0300 Subject: [PATCH 33/55] Muuntaja is a def --- examples/ring-swagger/src/example/server.clj | 8 ++++--- .../src/reitit/ring/middleware/muuntaja.clj | 23 ++++++++----------- .../reitit/ring/middleware/muuntaja_test.clj | 6 +++-- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/examples/ring-swagger/src/example/server.clj b/examples/ring-swagger/src/example/server.clj index 33223a64..16a1f036 100644 --- a/examples/ring-swagger/src/example/server.clj +++ b/examples/ring-swagger/src/example/server.clj @@ -10,7 +10,8 @@ [schema.core :refer [Int]] [ring.adapter.jetty :as jetty] - [ring.middleware.params])) + [ring.middleware.params] + [muuntaja.core :as m])) (def app (ring/ring-handler @@ -58,8 +59,9 @@ {:status 200 :body {:total (+ x y)}})}}]]] - {:data {:middleware [ring.middleware.params/wrap-params - (muuntaja/create-format-middleware) + {:data {:muuntaja m/instance + :middleware [ring.middleware.params/wrap-params + muuntaja/format-middleware swagger/swagger-feature rrc/coerce-exceptions-middleware rrc/coerce-request-middleware diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj b/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj index 8027b35e..6192a4ef 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj @@ -5,17 +5,12 @@ (s/def ::muuntaja (partial instance? m/Muuntaja)) -(defn create-format-middleware - ([] - (create-format-middleware m/default-options)) - ([options] - {:name ::formats - :spec (s/keys :opt-un [::muuntaja]) - :compile (fn [{:keys [muuntaja]} _] - (let [options (or muuntaja options)] - (if options - (let [m (m/create options)] - {:data {:swagger {:produces (m/encodes m) - :consumes (m/decodes m)}} - :wrap (fn [handler] - (muuntaja.middleware/wrap-format handler m))}))))})) +(def format-middleware + {:name ::formats + :spec (s/keys :opt-un [::muuntaja]) + :compile (fn [{:keys [muuntaja]} _] + (if muuntaja + {:data {:swagger {:produces (m/encodes muuntaja) + :consumes (m/decodes muuntaja)}} + :wrap (fn [handler] + (muuntaja.middleware/wrap-format handler muuntaja))}))}) diff --git a/test/clj/reitit/ring/middleware/muuntaja_test.clj b/test/clj/reitit/ring/middleware/muuntaja_test.clj index b9b5b6b1..690f7a5c 100644 --- a/test/clj/reitit/ring/middleware/muuntaja_test.clj +++ b/test/clj/reitit/ring/middleware/muuntaja_test.clj @@ -10,7 +10,8 @@ app (ring/ring-handler (ring/router ["/ping" {:get (constantly {:status 200, :body data})}] - {:data {:middleware [(muuntaja/create-format-middleware)]}}))] + {:data {:muuntaja m/instance + :middleware [muuntaja/format-middleware]}}))] (is (= data (->> {:request-method :get, :uri "/ping"} (app) :body @@ -36,7 +37,8 @@ ["/swagger.json" {:get {:no-doc true :handler (swagger/create-swagger-handler)}}]] - {:data {:middleware [(muuntaja/create-format-middleware)]}})) + {:data {:muuntaja m/instance + :middleware [muuntaja/format-middleware]}})) spec (fn [path] (let [path (keyword path)] (-> {:request-method :get :uri "/swagger.json"} From 3a8eae632465b2aaf94f348eb3710df9999b776b Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sun, 22 Jul 2018 14:59:19 +0300 Subject: [PATCH 34/55] all muuntaja formats wrapped --- .../src/reitit/ring/middleware/muuntaja.clj | 29 +++++++++- .../reitit/ring/middleware/muuntaja_test.clj | 58 +++++++++++++++++++ 2 files changed, 84 insertions(+), 3 deletions(-) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj b/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj index 6192a4ef..21c0548a 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj @@ -4,13 +4,36 @@ [clojure.spec.alpha :as s])) (s/def ::muuntaja (partial instance? m/Muuntaja)) +(s/def ::spec (s/keys :opt-un [::muuntaja])) (def format-middleware {:name ::formats - :spec (s/keys :opt-un [::muuntaja]) + :spec ::spec :compile (fn [{:keys [muuntaja]} _] (if muuntaja {:data {:swagger {:produces (m/encodes muuntaja) :consumes (m/decodes muuntaja)}} - :wrap (fn [handler] - (muuntaja.middleware/wrap-format handler muuntaja))}))}) + :wrap #(muuntaja.middleware/wrap-format % muuntaja)}))}) + +(def format-negotiate-middleware + {:name ::formats + :spec ::spec + :compile (fn [{:keys [muuntaja]} _] + (if muuntaja + {:wrap #(muuntaja.middleware/wrap-format-negotiate % muuntaja)}))}) + +(def format-request-middleware + {:name ::formats + :spec ::spec + :compile (fn [{:keys [muuntaja]} _] + (if muuntaja + {:data {:swagger {:consumes (m/decodes muuntaja)}} + :wrap #(muuntaja.middleware/wrap-format-request % muuntaja)}))}) + +(def format-response-middleware + {:name ::formats + :spec ::spec + :compile (fn [{:keys [muuntaja]} _] + (if muuntaja + {:data {:swagger {:produces (m/encodes muuntaja)}} + :wrap #(muuntaja.middleware/wrap-format-response % muuntaja)}))}) diff --git a/test/clj/reitit/ring/middleware/muuntaja_test.clj b/test/clj/reitit/ring/middleware/muuntaja_test.clj index 690f7a5c..f3d7fa31 100644 --- a/test/clj/reitit/ring/middleware/muuntaja_test.clj +++ b/test/clj/reitit/ring/middleware/muuntaja_test.clj @@ -83,3 +83,61 @@ (is (= #{"application/edn"} (produces path) (consumes path))))))) + +(deftest muuntaja-swagger-parts-test + (let [app (ring/ring-handler + (ring/router + [["/request" + {:middleware [muuntaja/format-negotiate-middleware + muuntaja/format-request-middleware] + :get identity}] + ["/response" + {:middleware [muuntaja/format-negotiate-middleware + muuntaja/format-response-middleware] + :get identity}] + ["/both" + {:middleware [muuntaja/format-negotiate-middleware + muuntaja/format-response-middleware + muuntaja/format-request-middleware] + :get identity}] + + ["/swagger.json" + {:get {:no-doc true + :handler (swagger/create-swagger-handler)}}]] + {:data {:muuntaja m/instance}})) + spec (fn [path] + (-> {:request-method :get :uri "/swagger.json"} + (app) :body :paths (get path) :get)) + produces (comp :produces spec) + consumes (comp :consumes spec)] + + (testing "just request formatting" + (let [path "/request"] + (is (nil? (produces path))) + (is (= #{"application/json" + "application/transit+msgpack" + "application/transit+json" + "application/edn"} + (consumes path))))) + + (testing "just response formatting" + (let [path "/response"] + (is (= #{"application/json" + "application/transit+msgpack" + "application/transit+json" + "application/edn"} + (produces path))) + (is (nil? (consumes path))))) + + (testing "just response formatting" + (let [path "/both"] + (is (= #{"application/json" + "application/transit+msgpack" + "application/transit+json" + "application/edn"} + (produces path))) + (is (= #{"application/json" + "application/transit+msgpack" + "application/transit+json" + "application/edn"} + (consumes path))))))) From 8d4bb4d6166543f9978740ce8776f26aa02fc68e Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sun, 22 Jul 2018 16:24:00 +0300 Subject: [PATCH 35/55] . --- examples/ring-example/src/example/server.clj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/ring-example/src/example/server.clj b/examples/ring-example/src/example/server.clj index 86fa8bf9..0181c606 100644 --- a/examples/ring-example/src/example/server.clj +++ b/examples/ring-example/src/example/server.clj @@ -3,7 +3,7 @@ [ring.middleware.params] [muuntaja.middleware] [reitit.ring :as ring] - [reitit.ring.coercion :as rrc] + [reitit.ring.coercion :as coercion] [example.dspec] [example.schema] [example.spec])) @@ -18,9 +18,9 @@ example.spec/routes] {:data {:middleware [ring.middleware.params/wrap-params muuntaja.middleware/wrap-format - rrc/coerce-exceptions-middleware - rrc/coerce-request-middleware - rrc/coerce-response-middleware]}}))) + coercion/coerce-exceptions-middleware + coercion/coerce-request-middleware + coercion/coerce-response-middleware]}}))) (defn restart [] (swap! server (fn [x] From 1eef6105770da8eb6e6d03058a909a99a1817067 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sun, 22 Jul 2018 16:26:03 +0300 Subject: [PATCH 36/55] better names --- .../src/reitit/ring/middleware/muuntaja.clj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj b/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj index 21c0548a..1e31192c 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj @@ -7,7 +7,7 @@ (s/def ::spec (s/keys :opt-un [::muuntaja])) (def format-middleware - {:name ::formats + {:name ::format :spec ::spec :compile (fn [{:keys [muuntaja]} _] (if muuntaja @@ -16,14 +16,14 @@ :wrap #(muuntaja.middleware/wrap-format % muuntaja)}))}) (def format-negotiate-middleware - {:name ::formats + {:name ::format-negotiate :spec ::spec :compile (fn [{:keys [muuntaja]} _] (if muuntaja {:wrap #(muuntaja.middleware/wrap-format-negotiate % muuntaja)}))}) (def format-request-middleware - {:name ::formats + {:name ::format-request :spec ::spec :compile (fn [{:keys [muuntaja]} _] (if muuntaja @@ -31,7 +31,7 @@ :wrap #(muuntaja.middleware/wrap-format-request % muuntaja)}))}) (def format-response-middleware - {:name ::formats + {:name ::format-response :spec ::spec :compile (fn [{:keys [muuntaja]} _] (if muuntaja From 0f384c2b528a9e6ecb55b29c25201f26516f5669 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sun, 22 Jul 2018 16:26:28 +0300 Subject: [PATCH 37/55] tune exceptions-middleware --- .../src/reitit/ring/middleware/exception.clj | 89 ++++++++++--------- .../reitit/ring/middleware/exception_test.clj | 2 +- 2 files changed, 49 insertions(+), 42 deletions(-) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj b/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj index 895f21ea..f36fc5e9 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj @@ -2,26 +2,6 @@ (:require [reitit.coercion :as coercion] [reitit.ring :as ring])) -(defn- super-classes [^Class k] - (loop [sk (.getSuperclass k), ks []] - (if-not (= sk Object) - (recur (.getSuperclass sk) (conj ks sk)) - ks))) - -(defn- call-error-handler [default-handler handlers error request] - (let [{:keys [type] :as data} (ex-data error) - ex-class (class error) - error-handler (or (get handlers type) - (get handlers ex-class) - (some - (partial get handlers) - (descendants type)) - (some - (partial get handlers) - (super-classes ex-class)) - default-handler)] - (error-handler error data request))) - (defn default-handler [^Exception e _ _] {:status 500 :body {:type "exception" @@ -42,6 +22,46 @@ :headers {"Content-Type" "text/plain"} :body (str "Malformed " (pr-str format) " request.")}) +(defn- super-classes [^Class k] + (loop [sk (.getSuperclass k), ks []] + (if-not (= sk Object) + (recur (.getSuperclass sk) (conj ks sk)) + ks))) + +(defn- call-error-handler [handlers error request] + (let [{:keys [type] :as data} (ex-data error) + ex-class (class error) + error-handler (or (get handlers type) + (get handlers ex-class) + (some + (partial get handlers) + (descendants type)) + (some + (partial get handlers) + (super-classes ex-class)) + (get handlers ::default default-handler))] + (error-handler error data request))) + +(defn- on-exception [e handlers request respond raise] + (try + (respond (call-error-handler handlers e request)) + (catch Exception e + (raise e)))) + +(defn- wrap [options] + (fn [handler] + (fn + ([request] + (try + (handler request) + (catch Throwable e + (on-exception options e request identity #(throw %))))) + ([request respond raise] + (try + (handler request respond (fn [e] (on-exception options e request respond raise))) + (catch Throwable e + (on-exception options e request respond raise))))))) + ;; ;; public api ;; @@ -53,32 +73,19 @@ ::coercion/request-coercion (coercion-handler 400) ::coercion/response-coercion (coercion-handler 500)}) -(defn create-exceptions-middleware +(def exception-middleware "Catches all exceptions and looks up a exception handler: 1) `:type` of ex-data 2) Class of Exception 3) descadents `:type` of ex-data 4) Super Classes of Exception 5) The ::default handler" + {:name ::exception + :wrap (wrap default-options)}) + +(defn create-exception-middleware ([] - (create-exceptions-middleware default-options)) + (create-exception-middleware default-options)) ([options] - (let [default-handler (get options ::default default-handler) - on-exception (fn [e request respond raise] - (try - (respond (call-error-handler default-handler options e request)) - (catch Exception e - (raise e))))] - {:name ::exception - :wrap (fn [handler] - (fn - ([request] - (try - (handler request) - (catch Throwable e - (on-exception e request identity #(throw %))))) - ([request respond raise] - (try - (handler request respond (fn [e] (on-exception e request respond raise))) - (catch Throwable e - (on-exception e request respond raise))))))}))) + {:name ::exception + :wrap (wrap options)})) diff --git a/test/clj/reitit/ring/middleware/exception_test.clj b/test/clj/reitit/ring/middleware/exception_test.clj index fe7d6733..d4991a4e 100644 --- a/test/clj/reitit/ring/middleware/exception_test.clj +++ b/test/clj/reitit/ring/middleware/exception_test.clj @@ -22,7 +22,7 @@ :parameters {:query {:x int?, :y int?}} :responses {200 {:body {:total pos-int?}}} :handler f}]] - {:data {:middleware [(exception/create-exceptions-middleware + {:data {:middleware [(exception/create-exception-middleware (merge exception/default-options {::kikka (constantly {:status 200, :body "kikka"}) From 44feacd7d31c8b58cca83a5f59ee879213d469ea Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sun, 22 Jul 2018 16:27:20 +0300 Subject: [PATCH 38/55] Full stack with data-specs --- examples/ring-swagger/src/example/server.clj | 63 ++++++++------------ 1 file changed, 24 insertions(+), 39 deletions(-) diff --git a/examples/ring-swagger/src/example/server.clj b/examples/ring-swagger/src/example/server.clj index 16a1f036..e8f1ce88 100644 --- a/examples/ring-swagger/src/example/server.clj +++ b/examples/ring-swagger/src/example/server.clj @@ -2,13 +2,11 @@ (:require [reitit.ring :as ring] [reitit.swagger :as swagger] [reitit.swagger-ui :as swagger-ui] - [reitit.ring.coercion :as rrc] - [reitit.coercion.spec :as spec] - [reitit.coercion.schema :as schema] + [reitit.ring.coercion :as coercion] + [reitit.coercion.spec] [reitit.ring.middleware.muuntaja :as muuntaja] - - [schema.core :refer [Int]] - + [reitit.ring.middleware.exception :as exception] + [ring.middleware.params :as params] [ring.adapter.jetty :as jetty] [ring.middleware.params] [muuntaja.core :as m])) @@ -16,16 +14,13 @@ (def app (ring/ring-handler (ring/router - ["/api" - - ["/swagger.json" + [["/swagger.json" {:get {:no-doc true :swagger {:info {:title "my-api"}} :handler (swagger/create-swagger-handler)}}] - ["/spec" - {:coercion spec/coercion - :swagger {:tags ["spec"]}} + ["/math" + {:swagger {:tags ["math"]}} ["/plus" {:get {:summary "plus with spec query parameters" @@ -37,38 +32,28 @@ :post {:summary "plus with spec body parameters" :parameters {:body {:x int?, :y int?}} :responses {200 {:body {:total int?}}} - :handler (fn [{{{:keys [x y]} :body} :parameters}] - {:status 200 - :body {:total (+ x y)}})}}]] - - ["/schema" - {:coercion schema/coercion - :swagger {:tags ["schema"]}} - - ["/plus" - {:get {:summary "plus with schema query parameters" - :parameters {:query {:x Int, :y Int}} - :responses {200 {:body {:total Int}}} - :handler (fn [{{{:keys [x y]} :query} :parameters}] - {:status 200 - :body {:total (+ x y)}})} - :post {:summary "plus with schema body parameters" - :parameters {:body {:x Int, :y Int}} - :responses {200 {:body {:total Int}}} :handler (fn [{{{:keys [x y]} :body} :parameters}] {:status 200 :body {:total (+ x y)}})}}]]] - {:data {:muuntaja m/instance - :middleware [ring.middleware.params/wrap-params - muuntaja/format-middleware - swagger/swagger-feature - rrc/coerce-exceptions-middleware - rrc/coerce-request-middleware - rrc/coerce-response-middleware]}}) + {:data {:coercion reitit.coercion.spec/coercion + :muuntaja m/instance + :middleware [;; query-params & form-params + params/wrap-params + ;; content-negotiation + muuntaja/format-negotiate-middleware + ;; encoding response body + muuntaja/format-response-middleware + ;; exception handling + exception/exception-middleware + ;; decoding request body + muuntaja/format-request-middleware + ;; coercing response bodys + coercion/coerce-response-middleware + ;; coercing request parameters + coercion/coerce-request-middleware]}}) (ring/routes - (swagger-ui/create-swagger-ui-handler - {:path "/", :url "/api/swagger.json"}) + (swagger-ui/create-swagger-ui-handler {:path "/"}) (ring/create-default-handler)))) (defn start [] From 862e9210726603c86354d0f31892da9c73d998d3 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sun, 22 Jul 2018 16:31:43 +0300 Subject: [PATCH 39/55] remove extra dep --- examples/ring-swagger/src/example/server.clj | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/ring-swagger/src/example/server.clj b/examples/ring-swagger/src/example/server.clj index e8f1ce88..d106edd0 100644 --- a/examples/ring-swagger/src/example/server.clj +++ b/examples/ring-swagger/src/example/server.clj @@ -8,7 +8,6 @@ [reitit.ring.middleware.exception :as exception] [ring.middleware.params :as params] [ring.adapter.jetty :as jetty] - [ring.middleware.params] [muuntaja.core :as m])) (def app From 8156922ebc2239adcf414a8b2877e1e0ac8656c6 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sun, 22 Jul 2018 16:36:02 +0300 Subject: [PATCH 40/55] fix tests --- .../reitit-middleware/src/reitit/ring/middleware/exception.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj b/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj index f36fc5e9..01c7d4e8 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj @@ -42,7 +42,7 @@ (get handlers ::default default-handler))] (error-handler error data request))) -(defn- on-exception [e handlers request respond raise] +(defn- on-exception [handlers e request respond raise] (try (respond (call-error-handler handlers e request)) (catch Exception e From 62cdfa2c52a4f4c4d33bedaed7046c3ec641deb3 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Tue, 24 Jul 2018 21:14:01 +0300 Subject: [PATCH 41/55] cleanup multipart --- .../src/reitit/ring/middleware/exception.clj | 105 +++++++++++------- .../src/reitit/ring/middleware/multipart.clj | 53 ++++----- .../reitit/ring/middleware/exception_test.clj | 2 +- 3 files changed, 91 insertions(+), 69 deletions(-) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj b/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj index 01c7d4e8..d07b959d 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj @@ -2,26 +2,6 @@ (:require [reitit.coercion :as coercion] [reitit.ring :as ring])) -(defn default-handler [^Exception e _ _] - {:status 500 - :body {:type "exception" - :class (.getName (.getClass e))}}) - -(defn coercion-handler [status] - (fn [_ data _] - {:status status - :body (coercion/encode-error data)})) - -(defn http-response-handler - "reads response from ex-data :response" - [_ {:keys [response]} _] - response) - -(defn request-parsing-handler [_ {:keys [format]} _] - {:status 400 - :headers {"Content-Type" "text/plain"} - :body (str "Malformed " (pr-str format) " request.")}) - (defn- super-classes [^Class k] (loop [sk (.getSuperclass k), ks []] (if-not (= sk Object) @@ -29,7 +9,7 @@ ks))) (defn- call-error-handler [handlers error request] - (let [{:keys [type] :as data} (ex-data error) + (let [type (:type (ex-data error)) ex-class (class error) error-handler (or (get handlers type) (get handlers ex-class) @@ -39,8 +19,8 @@ (some (partial get handlers) (super-classes ex-class)) - (get handlers ::default default-handler))] - (error-handler error data request))) + (get handlers ::default))] + (error-handler error request))) (defn- on-exception [handlers e request respond raise] (try @@ -48,44 +28,83 @@ (catch Exception e (raise e)))) -(defn- wrap [options] +;; +;; handlers +;; + +(defn default-handler + "Default safe handler for any exception." + [^Exception e _] + {:status 500 + :body {:type "exception" + :class (.getName (.getClass e))}}) + +(defn create-coercion-handler + "Creates a coercion exception handler." + [status] + (fn [e _] + {:status status + :body (coercion/encode-error (ex-data e))})) + +(defn http-response-handler + "Reads response from Exception ex-data :response" + [e _] + (-> e ex-data :response)) + +(defn request-parsing-handler [e _] + {:status 400 + :headers {"Content-Type" "text/plain"} + :body (str "Malformed " (-> e ex-data :format pr-str) " request.")}) + +;; +;; public api +;; + +(def default-handlers + {::default default-handler + ::ring/response http-response-handler + :muuntaja/decode request-parsing-handler + ::coercion/request-coercion (create-coercion-handler 400) + ::coercion/response-coercion (create-coercion-handler 500)}) + +(defn wrap-exception [handlers] (fn [handler] (fn ([request] (try (handler request) (catch Throwable e - (on-exception options e request identity #(throw %))))) + (on-exception handlers e request identity #(throw %))))) ([request respond raise] (try - (handler request respond (fn [e] (on-exception options e request respond raise))) + (handler request respond (fn [e] (on-exception handlers e request respond raise))) (catch Throwable e - (on-exception options e request respond raise))))))) - -;; -;; public api -;; - -(def default-options - {::default default-handler - ::ring/response http-response-handler - :muuntaja/decode request-parsing-handler - ::coercion/request-coercion (coercion-handler 400) - ::coercion/response-coercion (coercion-handler 500)}) + (on-exception handlers e request respond raise))))))) (def exception-middleware - "Catches all exceptions and looks up a exception handler: + "Middleware that catches all exceptions and looks up a exception handler + from a [[default-handlers]] map in the lookup order: + 1) `:type` of ex-data 2) Class of Exception 3) descadents `:type` of ex-data 4) Super Classes of Exception 5) The ::default handler" {:name ::exception - :wrap (wrap default-options)}) + :wrap (wrap-exception default-handlers)}) (defn create-exception-middleware + "Creates a middleware that catches all exceptions and looks up a exception handler + from a given map of `handlers` with keyword or Exception class as keys and a 2-arity + Exception handler function as values. + + 1) `:type` of ex-data + 2) Class of Exception + 3) descadents `:type` of ex-data + 4) Super Classes of Exception + 5) The ::default handler" ([] - (create-exception-middleware default-options)) - ([options] + (create-exception-middleware default-handlers)) + ([handlers] {:name ::exception - :wrap (wrap options)})) + :wrap (wrap-exception handlers)})) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj b/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj index a384f10e..ce61dbeb 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj @@ -1,34 +1,37 @@ -(ns reitit.ring.middleware.multipart +(ns ^:no-doc reitit.ring.middleware.multipart (:require [reitit.coercion :as coercion] [ring.middleware.multipart-params :as multipart-params])) -(defn multipart-params +(def parameter-coercion + {:multipart (coercion/->ParameterCoercion :multipart-params :string true true)}) + +(defn coerced-request [request coercers] + (if-let [coerced (if coercers (coercion/coerce-request coercers request))] + (update request :parameters merge coerced) + request)) + +(defn create-multipart-middleware "Creates a Middleware to handle the multipart params, based on ring.middleware.multipart-params, taking same options. Mounts only if endpoint has `[:parameters :multipart]` defined. Publishes coerced parameters into `[:parameters :multipart]` under request." ([] - (multipart-params nil)) + (create-multipart-middleware nil)) ([options] - (let [parameter-coercion {:multipart (coercion/->ParameterCoercion :multipart-params :string true true)} - coerced-request (fn [request coercers] - (if-let [coerced (if coercers (coercion/coerce-request coercers request))] - (update request :parameters merge coerced) - request))] - {:name ::multipart - :compile (fn [{:keys [parameters coercion]} opts] - (if-let [multipart (:multipart parameters)] - (let [opts (assoc opts ::coercion/parameter-coercion parameter-coercion) - coercers (if multipart (coercion/request-coercers coercion parameters opts))] - (fn [handler] - (fn - ([request] - (-> request - (multipart-params/multipart-params-request options) - (coerced-request coercers) - (handler))) - ([request respond raise] - (-> request - (multipart-params/multipart-params-request options) - (coerced-request coercers) - (handler respond raise))))))))}))) + {:name ::multipart + :compile (fn [{:keys [parameters coercion]} opts] + (if-let [multipart (:multipart parameters)] + (let [opts (assoc opts ::coercion/parameter-coercion parameter-coercion) + coercers (if multipart (coercion/request-coercers coercion parameters opts))] + (fn [handler] + (fn + ([request] + (-> request + (multipart-params/multipart-params-request options) + (coerced-request coercers) + (handler))) + ([request respond raise] + (-> request + (multipart-params/multipart-params-request options) + (coerced-request coercers) + (handler respond raise))))))))})) diff --git a/test/clj/reitit/ring/middleware/exception_test.clj b/test/clj/reitit/ring/middleware/exception_test.clj index d4991a4e..4bdb90eb 100644 --- a/test/clj/reitit/ring/middleware/exception_test.clj +++ b/test/clj/reitit/ring/middleware/exception_test.clj @@ -24,7 +24,7 @@ :handler f}]] {:data {:middleware [(exception/create-exception-middleware (merge - exception/default-options + exception/default-handlers {::kikka (constantly {:status 200, :body "kikka"}) SQLException (constantly {:status 200, :body "sql"})}))]}})))] From 2ab54a1b9952b0a2ff46584ea0500e0187d7dc7d Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sat, 28 Jul 2018 12:12:53 +0300 Subject: [PATCH 42/55] Exception middleware revisited --- .../src/reitit/ring/middleware/exception.clj | 125 ++++++++++++------ .../reitit/ring/middleware/exception_test.clj | 4 +- 2 files changed, 90 insertions(+), 39 deletions(-) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj b/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj index d07b959d..ef4fb1b7 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj @@ -1,6 +1,14 @@ (ns reitit.ring.middleware.exception (:require [reitit.coercion :as coercion] - [reitit.ring :as ring])) + [reitit.ring :as ring] + [clojure.spec.alpha :as s])) + +(s/def ::handlers (s/map-of any? fn?)) +(s/def ::spec (s/keys :opt-un [::handlers])) + +;; +;; helpers +;; (defn- super-classes [^Class k] (loop [sk (.getSuperclass k), ks []] @@ -28,6 +36,20 @@ (catch Exception e (raise e)))) +(defn- wrap [{:keys [handlers]}] + (fn [handler] + (fn + ([request] + (try + (handler request) + (catch Throwable e + (on-exception handlers e request identity #(throw %))))) + ([request respond raise] + (try + (handler request respond (fn [e] (on-exception handlers e request respond raise))) + (catch Throwable e + (on-exception handlers e request respond raise))))))) + ;; ;; handlers ;; @@ -60,51 +82,80 @@ ;; public api ;; -(def default-handlers - {::default default-handler - ::ring/response http-response-handler - :muuntaja/decode request-parsing-handler - ::coercion/request-coercion (create-coercion-handler 400) - ::coercion/response-coercion (create-coercion-handler 500)}) +(def default-options + {:handlers {::default default-handler + ::ring/response http-response-handler + :muuntaja/decode request-parsing-handler + ::coercion/request-coercion (create-coercion-handler 400) + ::coercion/response-coercion (create-coercion-handler 500)}}) -(defn wrap-exception [handlers] - (fn [handler] - (fn - ([request] - (try - (handler request) - (catch Throwable e - (on-exception handlers e request identity #(throw %))))) - ([request respond raise] - (try - (handler request respond (fn [e] (on-exception handlers e request respond raise))) - (catch Throwable e - (on-exception handlers e request respond raise))))))) +(defn wrap-exception + "Ring middleware that catches all exceptions and looks up a + exceptions handler of type `exception request => response` to + handle the exception. + + The following options are supported: + + | key | description + |--------------|------------- + | `:handlers` | A map of exception identifier => exception-handler + + The handler is selected from the handlers by exception idenfiter + in the following lookup order: + + 1) `:type` of exception ex-data + 2) Class of exception + 3) descadents `:type` of exception ex-data + 4) Super Classes of exception + 5) The ::default handler" + [handler options] + (-> options wrap handler)) (def exception-middleware - "Middleware that catches all exceptions and looks up a exception handler - from a [[default-handlers]] map in the lookup order: + "Reitit middleware that catches all exceptions and looks up a + exceptions handler of type `exception request => response` to + handle the exception. - 1) `:type` of ex-data - 2) Class of Exception - 3) descadents `:type` of ex-data - 4) Super Classes of Exception + The following options are supported: + + | key | description + |--------------|------------- + | `:handlers` | A map of exception identifier => exception-handler + + The handler is selected from the handlers by exception idenfiter + in the following lookup order: + + 1) `:type` of exception ex-data + 2) Class of exception + 3) descadents `:type` of exception ex-data + 4) Super Classes of exception 5) The ::default handler" {:name ::exception - :wrap (wrap-exception default-handlers)}) + :spec ::spec + :wrap (wrap default-options)}) (defn create-exception-middleware - "Creates a middleware that catches all exceptions and looks up a exception handler - from a given map of `handlers` with keyword or Exception class as keys and a 2-arity - Exception handler function as values. + "Creates a reitit middleware that catches all exceptions and looks up a + exceptions handler of type `exception request => response` to + handle the exception. - 1) `:type` of ex-data - 2) Class of Exception - 3) descadents `:type` of ex-data - 4) Super Classes of Exception + The following options are supported: + + | key | description + |--------------|------------- + | `:handlers` | A map of exception identifier => exception-handler + + The handler is selected from the handlers by exception idenfiter + in the following lookup order: + + 1) `:type` of exception ex-data + 2) Class of exception + 3) descadents `:type` of exception ex-data + 4) Super Classes of exception 5) The ::default handler" ([] - (create-exception-middleware default-handlers)) - ([handlers] + (create-exception-middleware default-options)) + ([options] {:name ::exception - :wrap (wrap-exception handlers)})) + :spec ::spec + :wrap (wrap options)})) diff --git a/test/clj/reitit/ring/middleware/exception_test.clj b/test/clj/reitit/ring/middleware/exception_test.clj index 4bdb90eb..9f897c78 100644 --- a/test/clj/reitit/ring/middleware/exception_test.clj +++ b/test/clj/reitit/ring/middleware/exception_test.clj @@ -23,8 +23,8 @@ :responses {200 {:body {:total pos-int?}}} :handler f}]] {:data {:middleware [(exception/create-exception-middleware - (merge - exception/default-handlers + (update + exception/default-options :handlers merge {::kikka (constantly {:status 200, :body "kikka"}) SQLException (constantly {:status 200, :body "sql"})}))]}})))] From 2c476177be3439b3e1f1e41c086d6ff2bdde1ef2 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sat, 28 Jul 2018 12:14:46 +0300 Subject: [PATCH 43/55] Multipart-params revisited --- .../src/reitit/ring/middleware/multipart.clj | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj b/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj index ce61dbeb..64365bee 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj @@ -16,22 +16,23 @@ if endpoint has `[:parameters :multipart]` defined. Publishes coerced parameters into `[:parameters :multipart]` under request." ([] - (create-multipart-middleware nil)) + (create-multipart-middleware nil)) ([options] {:name ::multipart :compile (fn [{:keys [parameters coercion]} opts] (if-let [multipart (:multipart parameters)] (let [opts (assoc opts ::coercion/parameter-coercion parameter-coercion) coercers (if multipart (coercion/request-coercers coercion parameters opts))] - (fn [handler] - (fn - ([request] - (-> request - (multipart-params/multipart-params-request options) - (coerced-request coercers) - (handler))) - ([request respond raise] - (-> request - (multipart-params/multipart-params-request options) - (coerced-request coercers) - (handler respond raise))))))))})) + {:data {:swagger {:consumes #{"multipart/form-data"}}} + :wrap (fn [handler] + (fn + ([request] + (-> request + (multipart-params/multipart-params-request options) + (coerced-request coercers) + (handler))) + ([request respond raise] + (-> request + (multipart-params/multipart-params-request options) + (coerced-request coercers) + (handler respond raise)))))})))})) From e879df54da8a5458a6bdb578a240e09e92a36190 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Mon, 30 Jul 2018 11:09:03 +0300 Subject: [PATCH 44/55] case --- modules/reitit-schema/src/reitit/coercion/schema.cljc | 2 +- modules/reitit-spec/src/reitit/coercion/spec.cljc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/reitit-schema/src/reitit/coercion/schema.cljc b/modules/reitit-schema/src/reitit/coercion/schema.cljc index c7bbc7e6..9bd512f6 100644 --- a/modules/reitit-schema/src/reitit/coercion/schema.cljc +++ b/modules/reitit-schema/src/reitit/coercion/schema.cljc @@ -48,7 +48,7 @@ (-get-options [_] opts) (-get-apidocs [this spesification {:keys [parameters responses]}] ;; TODO: this looks identical to spec, refactor when schema is done. - (condp = spesification + (case spesification :swagger (swagger/swagger-spec (merge (if parameters diff --git a/modules/reitit-spec/src/reitit/coercion/spec.cljc b/modules/reitit-spec/src/reitit/coercion/spec.cljc index db3e6206..7de3f423 100644 --- a/modules/reitit-spec/src/reitit/coercion/spec.cljc +++ b/modules/reitit-spec/src/reitit/coercion/spec.cljc @@ -87,7 +87,7 @@ (-get-name [_] :spec) (-get-options [_] opts) (-get-apidocs [this spesification {:keys [parameters responses]}] - (condp = spesification + (case spesification :swagger (swagger/swagger-spec (merge (if parameters From 4ea025dc83b9855ee60d686e5ccaa082311edd73 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Mon, 30 Jul 2018 11:09:40 +0300 Subject: [PATCH 45/55] more robust apidocs --- modules/reitit-core/src/reitit/coercion.cljc | 47 ++++++++++++++----- .../reitit-swagger/src/reitit/swagger.cljc | 11 +++-- test/cljc/reitit/swagger_test.clj | 18 +++++++ 3 files changed, 60 insertions(+), 16 deletions(-) diff --git a/modules/reitit-core/src/reitit/coercion.cljc b/modules/reitit-core/src/reitit/coercion.cljc index 04515d51..c5e9c07c 100644 --- a/modules/reitit-core/src/reitit/coercion.cljc +++ b/modules/reitit-core/src/reitit/coercion.cljc @@ -74,19 +74,19 @@ :or {extract-request-format extract-request-format-default parameter-coercion default-parameter-coercion}}] (if coercion - (let [{:keys [keywordize? open? in style]} (parameter-coercion type) - transform (comp (if keywordize? walk/keywordize-keys identity) in) - model (if open? (-open-model coercion model) model) - coercer (-request-coercer coercion style model)] - (fn [request] - (let [value (transform request) - format (extract-request-format request) - result (coercer value format)] - (if (error? result) - (request-coercion-failed! result coercion value in request) - result)))))) + (if-let [{:keys [keywordize? open? in style]} (parameter-coercion type)] + (let [transform (comp (if keywordize? walk/keywordize-keys identity) in) + model (if open? (-open-model coercion model) model) + coercer (-request-coercer coercion style model)] + (fn [request] + (let [value (transform request) + format (extract-request-format request) + result (coercer value format)] + (if (error? result) + (request-coercion-failed! result coercion value in request) + result))))))) -(defn extract-response-format-default [request response] +(defn extract-response-format-default [request _] (-> request :muuntaja/response :format)) (defn response-coercer [coercion body {:keys [extract-response-format] @@ -124,6 +124,7 @@ (->> (for [[k v] parameters :when v] [k (request-coercer coercion k v opts)]) + (filter second) (into {}))) (defn response-coercers [coercion responses opts] @@ -140,6 +141,28 @@ "{:compile reitit.coercion/compile-request-coercers}\n") {:match match}))) +;; +;; api-docs +;; + +(defn get-apidocs [this spesification data] + (let [swagger-parameter {:query :query + :body :body + :form :formData + :header :header + :path :path + :multipart :formData}] + (case spesification + :swagger (->> (update + data + :parameters + (fn [parameters] + (->> parameters + (map (fn [[k v]] [(swagger-parameter k) v])) + (filter first) + (into {})))) + (-get-apidocs this spesification))))) + ;; ;; integration ;; diff --git a/modules/reitit-swagger/src/reitit/swagger.cljc b/modules/reitit-swagger/src/reitit/swagger.cljc index dc2eca78..c17f4fb5 100644 --- a/modules/reitit-swagger/src/reitit/swagger.cljc +++ b/modules/reitit-swagger/src/reitit/swagger.cljc @@ -77,19 +77,22 @@ (let [{:keys [id] :or {id ::default} :as swagger} (-> match :result request-method :data :swagger) ->set (fn [x] (if (or (set? x) (sequential? x)) (set x) (conj #{} x))) ids (->set id) - swagger (->> (dissoc swagger :id) + strip-top-level-keys #(dissoc % :id :info :host :basePath :definitions :securityDefinitions) + strip-endpoint-keys #(dissoc % :id :parameters :responses :summary :description) + swagger (->> (strip-endpoint-keys swagger) (merge {:swagger "2.0" :x-id ids})) - accept-route #(-> % second :swagger :id (or ::default) ->set (set/intersection ids) seq) + accept-route (fn [route] + (-> route second :swagger :id (or ::default) ->set (set/intersection ids) seq)) transform-endpoint (fn [[method {{:keys [coercion no-doc swagger] :as data} :data middleware :middleware}]] (if (and data (not no-doc)) [method (meta-merge (apply meta-merge (keep (comp :swagger :data) middleware)) (if coercion - (coercion/-get-apidocs coercion :swagger data)) + (coercion/get-apidocs coercion :swagger data)) (select-keys data [:tags :summary :description]) - (dissoc swagger :id))])) + (strip-top-level-keys swagger))])) transform-path (fn [[p _ c]] (if-let [endpoint (some->> c (keep transform-endpoint) (seq) (into {}))] [(path->template p) endpoint]))] diff --git a/test/cljc/reitit/swagger_test.clj b/test/cljc/reitit/swagger_test.clj index b29b9305..9ac8fda8 100644 --- a/test/cljc/reitit/swagger_test.clj +++ b/test/cljc/reitit/swagger_test.clj @@ -182,3 +182,21 @@ (is (= #{::swagger/default} (-> {:request-method :get :uri "/swagger.json"} (app) :body :x-id))))) + +(deftest all-parameter-types-test + (let [app (ring/ring-handler + (ring/router + [["/parameters" + {:post {:coercion spec/coercion + :parameters {:query {:q string?} + :body {:b string?} + :form {:f string?} + :header {:h string?} + :path {:p string?}} + :handler identity}}] + ["/swagger.json" + {:get {:no-doc true + :handler (swagger/create-swagger-handler)}}]])) + spec (:body (app {:request-method :get, :uri "/swagger.json"}))] + (is (= ["query" "body" "formData" "header" "path"] + (map :in (get-in spec [:paths "/parameters" :post :parameters])))))) From 9330ee3bc5e3c57e7b05f318dfa03c0c865cd92a Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Mon, 30 Jul 2018 11:10:07 +0300 Subject: [PATCH 46/55] multipart robusta --- .../src/reitit/ring/middleware/multipart.clj | 81 ++++++++++++++----- .../reitit-schema/src/reitit/ring/schema.cljc | 30 +++++++ 2 files changed, 90 insertions(+), 21 deletions(-) create mode 100644 modules/reitit-schema/src/reitit/ring/schema.cljc diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj b/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj index 64365bee..e6152e02 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/multipart.clj @@ -1,15 +1,63 @@ (ns ^:no-doc reitit.ring.middleware.multipart + (:refer-clojure :exclude [compile]) (:require [reitit.coercion :as coercion] - [ring.middleware.multipart-params :as multipart-params])) + [ring.middleware.multipart-params :as multipart-params] + [clojure.spec.alpha :as s] + [spec-tools.core :as st]) + (:import (java.io File))) -(def parameter-coercion - {:multipart (coercion/->ParameterCoercion :multipart-params :string true true)}) +(s/def ::filename string?) +(s/def ::content-type string?) +(s/def ::tempfile (partial instance? File)) +(s/def ::bytes bytes?) +(s/def ::size int?) -(defn coerced-request [request coercers] +(def temp-file-part + "Spec for file param created by ring.middleware.multipart-params.temp-file store." + (st/spec + {:spec (s/keys :req-un [::filename ::content-type ::tempfile ::size]) + :swagger/type "file"})) + +(def bytes-part + "Spec for file param created by ring.middleware.multipart-params.byte-array store." + (st/spec + {:spec (s/keys :req-un [::filename ::content-type ::bytes]) + :swagger/type "file"})) + +(defn- coerced-request [request coercers] (if-let [coerced (if coercers (coercion/coerce-request coercers request))] (update request :parameters merge coerced) request)) +(defn- compile [options] + (fn [{:keys [parameters coercion]} opts] + (if-let [multipart (:multipart parameters)] + (let [parameter-coercion {:multipart (coercion/->ParameterCoercion + :multipart-params :string true true)} + opts (assoc opts ::coercion/parameter-coercion parameter-coercion) + coercers (if multipart (coercion/request-coercers coercion parameters opts))] + {:data {:swagger {:consumes ^:replace #{"multipart/form-data"}}} + :wrap (fn [handler] + (fn + ([request] + (try + (-> request + (multipart-params/multipart-params-request options) + (coerced-request coercers) + (handler)) + (catch Exception e + (.printStackTrace e) + (throw e)))) + ([request respond raise] + (-> request + (multipart-params/multipart-params-request options) + (coerced-request coercers) + (handler respond raise)))))})))) + +;; +;; public api +;; + (defn create-multipart-middleware "Creates a Middleware to handle the multipart params, based on ring.middleware.multipart-params, taking same options. Mounts only @@ -19,20 +67,11 @@ (create-multipart-middleware nil)) ([options] {:name ::multipart - :compile (fn [{:keys [parameters coercion]} opts] - (if-let [multipart (:multipart parameters)] - (let [opts (assoc opts ::coercion/parameter-coercion parameter-coercion) - coercers (if multipart (coercion/request-coercers coercion parameters opts))] - {:data {:swagger {:consumes #{"multipart/form-data"}}} - :wrap (fn [handler] - (fn - ([request] - (-> request - (multipart-params/multipart-params-request options) - (coerced-request coercers) - (handler))) - ([request respond raise] - (-> request - (multipart-params/multipart-params-request options) - (coerced-request coercers) - (handler respond raise)))))})))})) + :compile (compile options)})) + +(def multipart-middleware + "Middleware to handle the multipart params, based on + ring.middleware.multipart-params, taking same options. Mounts only + if endpoint has `[:parameters :multipart]` defined. Publishes coerced + parameters into `[:parameters :multipart]` under request." + (create-multipart-middleware)) diff --git a/modules/reitit-schema/src/reitit/ring/schema.cljc b/modules/reitit-schema/src/reitit/ring/schema.cljc new file mode 100644 index 00000000..094b23b4 --- /dev/null +++ b/modules/reitit-schema/src/reitit/ring/schema.cljc @@ -0,0 +1,30 @@ +(ns reitit.ring.schema + (:require [schema.core :as s] + [schema-tools.swagger.core :as swagger]) + #?(:clj (:import (java.io File)))) + +(defrecord Upload [m] + s/Schema + (spec [_] + (s/spec m)) + (explain [_] + (cons 'file m)) + + swagger/SwaggerSchema + (-transform [_ _] + {:type "file"})) + +#?(:clj + (def TempFilePart + "Schema for file param created by ring.middleware.multipart-params.temp-file store." + (->Upload {:filename s/Str + :content-type s/Str + :size s/Int + :tempfile File}))) + +#?(:clj + (def BytesPart + "Schema for file param created by ring.middleware.multipart-params.byte-array store." + (->Upload {:filename s/Str + :content-type s/Str + :bytes s/Any}))) From 9fdb495ab251de570f063d52e42ab9e345202cef Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Mon, 30 Jul 2018 11:10:31 +0300 Subject: [PATCH 47/55] :produces and :consumes can be overridden --- .../src/reitit/ring/middleware/muuntaja.clj | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj b/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj index 1e31192c..081d0762 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/muuntaja.clj @@ -6,13 +6,15 @@ (s/def ::muuntaja (partial instance? m/Muuntaja)) (s/def ::spec (s/keys :opt-un [::muuntaja])) +(defn- displace [x] (with-meta x {:displace true})) + (def format-middleware {:name ::format :spec ::spec :compile (fn [{:keys [muuntaja]} _] (if muuntaja - {:data {:swagger {:produces (m/encodes muuntaja) - :consumes (m/decodes muuntaja)}} + {:data {:swagger {:produces (displace (m/encodes muuntaja)) + :consumes (displace (m/decodes muuntaja))}} :wrap #(muuntaja.middleware/wrap-format % muuntaja)}))}) (def format-negotiate-middleware @@ -27,7 +29,7 @@ :spec ::spec :compile (fn [{:keys [muuntaja]} _] (if muuntaja - {:data {:swagger {:consumes (m/decodes muuntaja)}} + {:data {:swagger {:consumes (displace (m/decodes muuntaja))}} :wrap #(muuntaja.middleware/wrap-format-request % muuntaja)}))}) (def format-response-middleware @@ -35,5 +37,5 @@ :spec ::spec :compile (fn [{:keys [muuntaja]} _] (if muuntaja - {:data {:swagger {:produces (m/encodes muuntaja)}} + {:data {:swagger {:produces (displace (m/encodes muuntaja))}} :wrap #(muuntaja.middleware/wrap-format-response % muuntaja)}))}) From 79d3191702cbcd3680a1354193c86d190a30ca7f Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Mon, 30 Jul 2018 11:10:46 +0300 Subject: [PATCH 48/55] upload & download example --- examples/ring-swagger/resources/reitit.png | Bin 0 -> 506325 bytes examples/ring-swagger/src/example/server.clj | 27 +++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 examples/ring-swagger/resources/reitit.png diff --git a/examples/ring-swagger/resources/reitit.png b/examples/ring-swagger/resources/reitit.png new file mode 100644 index 0000000000000000000000000000000000000000..c89c3654889a6c3a146f404a4fb4f24111477333 GIT binary patch literal 506325 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

I&&*DVD+A=oFO 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 D7ra$i;r}%Tp^pMb$l%$n@bYr`}dI1 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%0AJ|x@8s!$?DM%S|2Mv9wg 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

-Ea-aB+*UMya70x{tj?G4`M0D6 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 QI|q}9mK z=COt6PkCrXA7(E+iI^}@l(5fg?m=bBPqmf+(xF@O{s;pRogmI$F1K@)uu6dP(wCYPwK5W2wUgcVk~e`V3++$_ z4MrVY(NC=}6|i;4$3}t9Q`dgmisb#GAN(?=m-{eZe1MZo%`}E(EA>46=rTtnlwaE= zYnV-@)B(;Sv?D2WjT<~7g*-Fc7Hbx;Ro)tNG7Ty+59RH~Zm(MV&x>cq)v_aCB}rYE ztuls;6;jWmHU!&v zB!(#nJDI4XDG)K0xH5Hb%xQQ5X@Y3EIu_!{ZP6S1qFeazFap03*j>tFX9jt zINH~O49gG09r4PIcVx_LhcL2V5O^J?JxP&SVD6QmwaE1!D~3# zU24BiV(-Bv9s$m`3l1kcKf728sb6E}N!G4*%E;DDOP;LQ6I@;v$ zQjA`r0Qs5X&yJ5ij#{ioiA<{eO|Sc95?!U5Rz%C0^V)w)W3$#N<(4UNjjgCY=+P6M ziMNOJg_X9?0M8EXP{v-aI0mp_k#Wue`R% zQ@z20D1ur_MP|kHX_uo8(Vx*d?Zy=xqGQim`}jvCNWYv}rq z>sU(LFR3m%2o3NydmRUd&`Wkckvh15oK>L=-*?O>uiwgB`<1@zY>70$a|S#wPyFZ@ z$ZA=)2P#9`F(ntJVy(-BRRCHXhDsXx%rfcK30|bO)db`1#E)ZF1t(tQK?8!N6=o2; zm>#=^GDi99TKh@NzLs(Zf+fzFwHWL;-(d4_lC^~~B%mB+kv1=K_3fa9JK{#9x&DQB@`%JW9(B#R!Ef+WJ?ygrR&&%fghdMH>G8?k9Arq=E-fdN zXO2H7apIbi4n@Z|a(@4_Ro^E)H|OOnPb+w@A+EolejL2?&SGo=s=!r)co@knOb!N?d|OS;t8*7Su@DX%==IG1a_?f;P|m z_blqh#-I-U#%!JCoCm$*i_-1*25y$KO4#l~Ul4KKix3BSSFU2g|8~=OWO={fpc%H|qY!Mz@wMtVQiv zphV*7Px_!b^wz_I3E?X^MW^oevkAV5p_ESwk(jRq65%MbkRcTsE)uR8@~(6M{htf& zlYpRDQ%-NCd-&q(S*KOMh?F#vVDxx-&&>{j2dWAivepUnE(a5*5^ zHIiFcm`~^l3>poU1s2%;Kbp=xo(cbt_ikAdD!)iBQ;N#1T;?_#5tYmI6>?qWo(*X< z%n*{0TN2BVP)Tx$-0zpU&fUm;w7F!P(JYs<&f}av_Lu+mc+BVXdB0z;=kph{o!6^q z`gxM&9&P`}*8g0LxP2kYnycPa~-3SMEnA9lF)1BlEwm&pp@X(!EPE z_~Ad_9>c~*MU@>uN%$8p8`>)89PvoW`&!V+S8v|ArKfrFwpy0& zfjBCmUM0;>4rX1gIe9Cf@2VfUd?WDfnD0cd}${Seu_ul8&c$iFk z250CyF!`vj<)WPQDy@UlG`djzKjm!dCkx@>b0XDetDuBVMGFIX)BK2w(s%k1^I24G z8j+YHEbXlKWuJbMy$c5Ur?Rb^~v5TYhwgQn? zQrJhLU13Tj-pN$UANyzXvYj+eNsbYEeK8$2I$3*tjeByj$I%!A_&q;5PHQ|!O9gC< z<`iVdEv}(h2D)E1$HgbK=r&Kiws#UVv!Uxh5F8{|142I}es_e=^^M>Gsp{6B%}bnd z{9MVctQz?X4n*>6vnSVXx(L3ii-&;c|JVzk6FZV-GkcxXnl8+!bd;^+Jj%@HDOMs1 zPv2G~v+h}z(tjv+3Ny%PWTSMn)LmyQsc0vw5a+=MUlLD+ly6-=?1%t=y7xa`L8l$l z37)Kek_GT+D$Fj1_ZzRqm>+Z1MoK&auS<>?);Q)?(oMSpE3RZcAFW+fLPkC_{ zR^P}%$^yF+A%7Pf5Tqk>UG9kH?`3s2vJv9*hzsycmwIV_y~-&rbpP`v3Nd-C<9d$M zoQvwy`G^T1C>IOx5nWwu!IM-`zw?5sZm*sSmFB2J!x;;qt)DrsBvvMn)o}}q2qA94 zW9c7pXOyHT%>2fE@0$-L-F!i8$cryK^7o#)i5m!})HI4BbKKfKUxw^(Cc z_e)iotrpD5!NT;W1#nE-^EoOTvW~U zrxvC`By;pO>z{;8wk4(uJ4~@+o=zEJcM6MxYNEAnio63Y-G8RrL^-9U<5W(w>oOg9 zoen|CHuktJDd^Sp4n49{wOoCuT7A;kRXI7nL9=C32tIuJkHfWe3SAkoN~Mz9>&gnrIJHf6qy$V&yuSBBiGP^lryh!Q*o<4;Q7rzVIvR}O7@xAoF{mkfJn5m$bbC&Wag90=?i z&q29K^S{nQmJ;58ee%DrDsbXKAx~Ph)jKQg^}g7+S!AatTEOgK)z^NV_4r*2suLzE z&SHAST?^>fpSR1O=>Loee|Zau;imKp1!|y1OIO`Y;<2kQ0NHo5`yRI03FKZbT<`5< zi4W~4oDFo3;8ad_`%D6NA|yt7XdOzm2(ucYKlWwy$Bw9-w=g?RD%ykL7} z6>G>8+A&x9s*-G~(VeDrR7#osf~dX98R5^uXYkLn5wP(cV7Fn{b1^B`o_&n zeG=sv-=cl`7IcAl<(DZgJRT=hTF2?NdM8FHhC6}3SC~0T%S*ikUtAGsQhI^E$H;UR zWnFN8f+TZa1F(oMN`BbqN~4s%J{*K-Jp9xL2+KfHXsJadkn>%JV{0KUn;XE2v=07K zi`&#+`Mfoyn~bgzozib1(r=HmcVr7$7nfagE#4t6AsnRpCI@X97h{jR=JXRTC}t)K zVHPdkH2SA?dQ2AH!?Y)EBzi7|tH$c1)+F7_sh^sNYe~bW{0{&PubqcJo00ih+X_6-?CfN%sPeD z_-|+4##9c5MS~4}j$~0PQ;tlU^Ec->vxttr`t4%Je7%CLudkP=vl4@~(l9!c{gAar zH|$wnx1pkUaHe_a8*cHvIN{C83@~zdeU94Y;`Ufh(D`w<3Nzg&$)oCq`jd^_j>2)i zWyB45{lZvLLwb=4ipJ#!i8hnht?Eg0K7?gY$$w0{F_7RIFg(q&^sBm8M0+$LmhI!W zAE@+v{K~`k008O#j5qiAUsVWigl6eS@-)g>%Izd&>y=>0~?~{BaKIAF&Sw- zLWOc!i}?fNwDk-wHs(#*kyr?{BQkOOR=}vIPA!Yzn!!huSFm45lPi5!??sTS`|#D` z%2#yy!s{WPMq+=dKg-O^2bP1j)bSckDrf+bd31DA8=eLJ5(#Iuu`j;}bJ&jnIj=XH z=6qOR%K1mj`2KI>xwfIi%n z42>5DgW_EhhgPoNA2KQReUPqXK(4+DA`SicksMnTRMVdue@qWP{rhX^)M_)JNIEI; zmLx*bzv)5PVCZaxu(5Esn-2_oK%ho>@=lX?35^DhWebktr$0Ig=ZPsRFsYr4t7Uw-}T9 zc_EFDqKYlWrH0ccO&SB5RveUe-ar+%Tdyml06YDQcT_g@2xohR!l7bgbE8}9;rmZn(-FU^i z1Z8Y=&c2cS*=r|Mm*91^nu)N~@ao0y*R_aJE}=%;;Z>J@xn8qYfYx=70YFW2dn;NK zgGy43%o{$(Lz-t#9k}(MDa3`-5=HmEU-n5$H8mBGhF}%yr25Hiz#L4e>o}=>F3wd@ zpPU?Ta+q5o+|ot@pM?s4_I;sq@65!w1*XAvBk`Eub>?UPHOqb2*YejegjJ4}V^t3? z@>F<~+xvXEx0nhiskDN`QilJsn>X(Ae!vN2;16;Nsl|rG{!oIQ9`P_@A#5h(BU#jU z^x~uiCbDu{F+`1_5WGP4>dxae7KA$nRK{w-=@RPb)~yTBed8MVL7?ae>}j8?kD^S-dsVS<;RA{36)pSm%)R^~bSwubDK1jZ zt&jNMua!HG3u9fbx_)v=AjAtpL$uX~3-s9!ueskHu+*T?70pPdoSp^ZCFHO>PS{ch zTT9#w{>~dfk087C;sHYT|GAzI3(yL#u%0;>X_J8p40%qy>WFDLC8L2Yq;U*>*cq!E z;hFOs{8nbj7KmPOq?u>qDrKI{F_wEF`vUShy7`QO(be}^O>x36@xHYN_hii-0HP=s z*}?(YbE-z{mIla2zP>gwR}HdLlY39Y$qMmM>aCJY1Rm>n>8bdrVsC@*1pf;saX~d| zI-mz}$pYgJ{;&Cu*k#NV3-9Oe%tb7lUU+pV?2YYR)x6D-8w|NdC1z+(*0W!{7P<$A z`pU(t%seyz?lQT9<10bT|4>uJdG1y6$F(Nmuj|IKFjB`%%-fvBq*qWETYwyVOHhlbeF^b=V*is_~~zuZ!xRw8hVhLZ+Z4_hRZFExbs<6K4(=MVdPOCyQEF+up0ETr$)e!%z4I>Vc1#sfR+!pCOGZhkK$?m9Zt@A&a#+b zPBwg~pFLan)rinLz|qi5*g`F8IY4wVx3};ik815Up9w&}DC(56*P>vCYKP~rPgGIV zPxR~J3Ex?Tcp1=qg{`-BwTy!x;jwx6 zL24X$Pb}Q|{2*8yc)x_};d^Dc2j-<#R#^Se*wgLrA=jE6`{oTBFSlLHXSKjyG#(K7 z#qk_DuBw9G?kdTMKUntf>xId4bj`WSNbmeAs;Ca@54&C3%VSyhT$_yzL_EU$UGp8?9G&pZkw)j!4wx2|jt* ztK7KURr%Zra6>JdXe3f%^hT)dLxmNuAb~G%PfUy{_P?6M%9s!Rsxmkv%r5NJ-oFU@ z6jztotB&E$0h10NU18(jKb}s?wZ(jniMHrrMqB$D60pbu&i|zMc7QztK?jW`n_oHc zaYfGfv*>=}A#PivC$B#;F$b}Qn!GW@J;N^K1ZJy1>RnI%CQPtEJTsl;$R{d7f>PX95Ubi_Jpvi!Dg${_`_UPuDXQcPg>H12{GTE zi;fT14j*jJ2B8!`A9+=3y33ZR*UApeKX=EX7)~nxRZ2OWavfwkOgAibuyyrQ|H0%fHCLUU43rY&<3$o?#4!8QMMq~> zh>g~kx}?VHaEU*D2j^l-45qz`{&5?Tr^q91mdTBuM1?+LJ62;kVgg{8qrd;Kr}W1~ zXP$w>w_Q$n($TsvhSoDF-(u#Fz6<-uzQY^8bA!ecpIH5+PP@@IZ?Fpy%RF@p#nqMH ze*MzZ=%Eoa6WGmaD|;~1Lkyuyp;<8E-Bc&$j*PHS2s-!h?KFAJx&}+W-Y2?&b$8Br zrfx@5re(g={0QS=*k*lUYdsyR)F zQK7>4&Wj1VI+I=|kZkc4d$GiC-p~(gE03I8y1y9P=(N~&BeqMXZI4G`g9Dx|4(9(V zs1TBXBsy3m6_xbYlq{25?H!B4sr)0RWS&4SfF4+R(r=HeW5i z!?90Jt_=@M28?UwC^_*_OTR=FYyJA{=-wp*mv%~OIFi(j<@JF^9QWm1^#N~=6YoQh zwk`dcS^j5V#A?*v&80tV6({6-f)m)fNsjT198b|T+J5Y44 zHIqe_uATlF#QIM>Rnk_&dVXE;efl9)d!(XyuFlJd-Th^RxXvm~a`7?-Vh?O?r^JT}K| z^LL7-cRUp73|%ib0=q9-m*(omW_U`5?pwW5&|%jkz5prU20h`wRFTIg^4>^6h_);~ zcf;+IOTXY7UsSdWdT7a7Mn5jAvfUKr#DO(-v6!|bWD-CgVyY5r0YBM>r_QMb@{(e3Z zF_p_IxRYU_V$^3yIIk)}Ue&@A>x`dFGD389()gvPohr{LB6c!k8h={*v+22GPum%U zJS{7bA>?l*3`4+Ge*dlp<~exAAS(b8HAw7q6hzJu(k#NPqjVUAUjr<}r~~Nfxgzu# z5~!L|eb7&AI@m7N93Yl+L&Jmrn`yBLAAr7Y}vvgFjbO2ri5V^a1=BBLc zdWt-!GMv$$MZ(fN;GF}g7t7lfZklr*Ptj}qdgUq3ESh6lpW{CWPf5JPjsslkzc9U$ zoREsP$oA!i0JYUnH_cLzc$N{SL8k3!ai)qYJapsx_FWkfdy?8lvAH9>;Yy#Ro&R#=;Wxl>^U|i> z(;8Y+7RQB*S6AjWxLMay{ypKOrI57g}Pc^Dq(!mJa94I~%433d^y1!eo<-!OvTLKBhbIV{`WcX*>N@)q-cMsTM(1 zRIP)JH^3K+CZC3>N9*|jQeGHSF~b_25L|k8)hM?y;cHD&Q&FQ^8Jx?1EZ!2l@IJ}+ z8X}x{S@1JXd+w%>5j&>mN^Egrnw+H=+{3dTwVKfr(O6Xa7UsmaTi`Kw@^9g3%eoIn z(+uF8jydbgv%>_lfDY={oZoAME4d-Lk>b1{I`o~!+kgTE5gn#QaD|k9gyL)Qk!$X^ z)6#u4o<8&bJ8I()ym3>QL=cDb5#0O&h%vF&o{s}YN21Dhn+UOFKh(dk(Hc+lpK|KLmb+f_%}C*BZ4ygB#l!P%If2f6)X+TPkHpe|KzNdenJueEF$QE$I6 zQ*Cr1*Rs$b#vX`}@-X};w?!CmnmD)u@K{!XUhS8mFaDH zMWWL6@xd7>*tWK;`Br@$3b%uHUVXfIY3{U{6FHx!YaK(HOW#|4qW%k z&D57WQ7vA~vB70=PIHnKvP>-gPHKa>C^BnPV%Cvb9W~5?BW3GTm4NfOt6K!lLVLU5ABRBNK&oItv-fev|9+2yoRz$3Y3+8#`yz8OZA z5(X@CRLSLr=Fs3_bO(c{hOv63UnXcx^_fK`Z>*L8W^H{Ux*;T%A1EU$lv=HJm;_}} zM}Y~_u<5Yr-vTv8eWSRXazhC?XF$hZEmiSMu*pzk|CmRLgegw@SYrb(yFOV%@)+g} z{X*I{I4{t81~3!%swI9)>MZ43C`rbwUm3hXdMCYVGc(Vpkv;)?;F}Pvvr1 zp&kKi%P%)D#%|QsJ}-hrXyJ!Ip!vyUB~(vZzMnbNO)u0Jz#6(JD$QO$rPy?oQC3bi z*A1vVt?PY2ctZ+Lt(cI5zj%&On_uYWX3+c>7A9?`mz$_^?v&4)qiH``#2ZPk22%?f zigW0%eV0i-_%~t(^$3lF5+EC|X*`WHTUYM8)_M7WJY@Jv6LxrFQsdXjCwaU{I>t2( zBikFXOYQi{)H~tsMqv?BkzWyCgx5_3yZLs{C_@4P3^!X2QIF_VjaaG1hy!QYM?;c@ z+%8z_HpEjnY$&*~nTn%_Y?S^Yn(?%%C5r8|=g;h~ZM_&<(o<|2Q0_R3F$R8nGsF!u z4gD{pOt_?HlaD!R_O=MJPlc6MM?5Mfm|{T|d)Gd20(V`++ZmH4up?m;^gi{$FKt~? zqn~Hy)slq}hmTs%^`;$3^Ns&*Q4(h`d*Ob0vX&07V7yQ+x0Hoo(sYpMv;LR;v;A9+ zgNQQ2K&uwNlk}I)hda%M?o&4vW|(DB!m&y6N8M?Z*P6R2d9Nt11uQ5uh8OMS@))m> z#DWr9_?YK(u`gbQeX&;TKXG2P!?&N!Y?TRAW@#cvyjti7QnOK$Y$Y?ZoYyo%^FIZ0&f^n&@}d~3_9?ubaB%) z6BTy(T+6!7Rj(R`+X|s(xo~{PCvBwfCJPY8&sBc3BbivOwR{KNn!k zlyAM()oB}nA>tCgmHHc_9Kb2Q8%oMaU_afqvcp+q06R-8UfM=z5M8K_dd}Lha_G;arr_3#S0JwDlF2qR&i}jj z6zu%e{sDyYP$04F9IOg5SeRRO6MuE%75}S5x3ZQzV;8-n2*9pOmWqM6^y1|vb{mIM z#C2sboMh){3;;&suHlNU(Ypv+yz>IpKo42SYuOEYT-j4`trj5~YXpSO(DN^sI7xgw zpsSL102bQyW4y24u{?k_zfk#v#+4iHvRE~ymLc#|c@37=vp%)NFK&n;$2LI;f5H

*$K+^zFa5GZQ&&}!p38tdwQ4H9Qn+;YB2ge) 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 YaQDfSvkj$kT=0*En)dO;V`qH-52_+2(f|Me literal 0 HcmV?d00001 diff --git a/examples/ring-swagger/src/example/server.clj b/examples/ring-swagger/src/example/server.clj index d106edd0..ff5b57a2 100644 --- a/examples/ring-swagger/src/example/server.clj +++ b/examples/ring-swagger/src/example/server.clj @@ -6,9 +6,11 @@ [reitit.coercion.spec] [reitit.ring.middleware.muuntaja :as muuntaja] [reitit.ring.middleware.exception :as exception] + [reitit.ring.middleware.multipart :as multipart] [ring.middleware.params :as params] [ring.adapter.jetty :as jetty] - [muuntaja.core :as m])) + [muuntaja.core :as m] + [clojure.java.io :as io])) (def app (ring/ring-handler @@ -18,6 +20,25 @@ :swagger {:info {:title "my-api"}} :handler (swagger/create-swagger-handler)}}] + ["/files" + {:swagger {:tags ["files"]}} + + ["/upload" + {:post {:summary "upload a file" + :parameters {:multipart {:file multipart/temp-file-part}} + :responses {200 {:body {:file multipart/temp-file-part}}} + :handler (fn [{{{:keys [file]} :multipart} :parameters}] + {:status 200 + :body {:file file}})}}] + + ["/download" + {:get {:summary "downloads a file" + :swagger {:produces ["image/png"]} + :handler (fn [_] + {:status 200 + :headers {"Content-Type" "image/png"} + :body (io/input-stream (io/resource "reitit.png"))})}}]] + ["/math" {:swagger {:tags ["math"]}} @@ -50,7 +71,9 @@ ;; coercing response bodys coercion/coerce-response-middleware ;; coercing request parameters - coercion/coerce-request-middleware]}}) + coercion/coerce-request-middleware + ;; multipart + multipart/multipart-middleware]}}) (ring/routes (swagger-ui/create-swagger-ui-handler {:path "/"}) (ring/create-default-handler)))) From 82fac3ee9c795a37874a9e95580c3234098bde56 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Wed, 1 Aug 2018 17:03:47 +0300 Subject: [PATCH 49/55] docs --- doc/SUMMARY.md | 1 + doc/ring/README.md | 1 + doc/ring/extra_middleware.md | 65 ++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 doc/ring/extra_middleware.md diff --git a/doc/SUMMARY.md b/doc/SUMMARY.md index 1e303093..0564015e 100644 --- a/doc/SUMMARY.md +++ b/doc/SUMMARY.md @@ -28,6 +28,7 @@ * [Dynamic Extensions](ring/dynamic_extensions.md) * [Data-driven Middleware](ring/data_driven_middleware.md) * [Middleware Registry](ring/middleware_registry.md) + * [Default Middleware](ring/default_middleware.md) * [Pluggable Coercion](ring/coercion.md) * [Route Data Validation](ring/route_data_validation.md) * [Compiling Middleware](ring/compiling_middleware.md) diff --git a/doc/ring/README.md b/doc/ring/README.md index 87356e08..f215c0f7 100644 --- a/doc/ring/README.md +++ b/doc/ring/README.md @@ -7,6 +7,7 @@ * [Dynamic Extensions](dynamic_extensions.md) * [Data-driven Middleware](data_driven_middleware.md) * [Middleware Registry](middleware_registry.md) +* [Default Middleware](default_middleware.md) * [Pluggable Coercion](coercion.md) * [Route Data Validation](route_data_validation.md) * [Compiling Middleware](compiling_middleware.md) diff --git a/doc/ring/extra_middleware.md b/doc/ring/extra_middleware.md new file mode 100644 index 00000000..82b61a8d --- /dev/null +++ b/doc/ring/extra_middleware.md @@ -0,0 +1,65 @@ +# Default Middleware + +Any Ring middleware can be used with `reitit-ring`, using data-driven middleware is preferred as the configuration , and in many cases, better performance. + +To make web development easier, `reitit-middleware` contains a set of common ring middleware, lifted into data-driven middleware. + +```clj +[metosin/reitit-middleware "0.2.0-SNAPSHOT"] +``` + +Any Ring middlware can be used with `reitit-ring`. + +`ring-handler` injects the `Match` into a request and it can be extracted at runtime with `reitit.ring/get-match`. This can be used to build ad-hoc extensions to the system. + +Example middleware to guard routes based on user roles: + +```clj +(require '[reitit.ring :as ring]) +(require '[clojure.set :as set]) + +(defn wrap-enforce-roles [handler] + (fn [{:keys [::roles] :as request}] + (let [required (some-> request (ring/get-match) :data ::roles)] + (if (and (seq required) (not (set/subset? required roles))) + {:status 403, :body "forbidden"} + (handler request))))) +``` + +Mounted to an app via router data (effecting all routes): + +```clj +(def handler (constantly {:status 200, :body "ok"})) + +(def app + (ring/ring-handler + (ring/router + [["/api" + ["/ping" handler] + ["/admin" {::roles #{:admin}} + ["/ping" handler]]]] + {:data {:middleware [wrap-enforce-roles]}}))) +``` + +Anonymous access to public route: + +```clj +(app {:request-method :get, :uri "/api/ping"}) +; {:status 200, :body "ok"} +``` + +Anonymous access to guarded route: + +```clj +(app {:request-method :get, :uri "/api/admin/ping"}) +; {:status 403, :body "forbidden"} +``` + +Authorized access to guarded route: + +```clj +(app {:request-method :get, :uri "/api/admin/ping", ::roles #{:admin}}) +; {:status 200, :body "ok"} +``` + +Dynamic extensions are nice, but we can do much better. See [data-driven middleware](data_driven_middleware.md) and [compiling routes](compiling_middleware.md). From cc00ddb97c374d18439d02eaa1687b830023bad3 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Wed, 1 Aug 2018 23:10:56 +0300 Subject: [PATCH 50/55] exception mw docs --- doc/ring/extra_middleware.md | 109 ++++++++------ .../src/reitit/ring/middleware/exception.clj | 134 ++++++++++-------- .../reitit/ring/middleware/exception_test.clj | 58 +++++--- 3 files changed, 178 insertions(+), 123 deletions(-) diff --git a/doc/ring/extra_middleware.md b/doc/ring/extra_middleware.md index 82b61a8d..16b7afe9 100644 --- a/doc/ring/extra_middleware.md +++ b/doc/ring/extra_middleware.md @@ -1,6 +1,6 @@ # Default Middleware -Any Ring middleware can be used with `reitit-ring`, using data-driven middleware is preferred as the configuration , and in many cases, better performance. +Any Ring middleware can be used with `reitit-ring`, but using data-driven middleware is preferred as they are easier to manage and in many cases, yield better performance. To make web development easier, `reitit-middleware` contains a set of common ring middleware, lifted into data-driven middleware. @@ -8,58 +8,81 @@ To make web development easier, `reitit-middleware` contains a set of common rin [metosin/reitit-middleware "0.2.0-SNAPSHOT"] ``` -Any Ring middlware can be used with `reitit-ring`. +## Exception handling -`ring-handler` injects the `Match` into a request and it can be extracted at runtime with `reitit.ring/get-match`. This can be used to build ad-hoc extensions to the system. - -Example middleware to guard routes based on user roles: +A polished version of [compojure-api](https://github.com/metosin/compojure-api) exception handling. Catches all exceptions and invokes configured exception handler. ```clj -(require '[reitit.ring :as ring]) -(require '[clojure.set :as set]) - -(defn wrap-enforce-roles [handler] - (fn [{:keys [::roles] :as request}] - (let [required (some-> request (ring/get-match) :data ::roles)] - (if (and (seq required) (not (set/subset? required roles))) - {:status 403, :body "forbidden"} - (handler request))))) +(require '[reitit.ring.middleware.exception :as exception]) ``` -Mounted to an app via router data (effecting all routes): +### `exception/exception-middleware` + +A preconfigured Middleware using `exception/default-handlers`. Catches: + +* request & response [Coercion](coercion.md) exceptions +* [Muuntaja](https://github.com/metosin/muuntaja) decode exceptions +* Exceptions with `:type` of `:reitit.ring/response`, returning `:response` key from `ex-data`. +* safely all other exceptions + +### `exception/create-exception-middleware` + +Creates a reitit middleware that catches all exceptions. Takes a map of `identifier => exception request => response` that is used to select the exception handler for the thown/raised exception identifier. Exception idenfier is either a `Keyword` or a Exception Class. + +The following handlers special handlers are available: + +| key | description +|--------------|------------- +| `::default` | a default exception handler if nothing else mathced (default `exception/default-handler`). +| `::wrap` | a 3-arity handler to wrap the actual handler `handler exception request => response` (no default). + +The handler is selected from the options map by exception idenfitifier in the following lookup order: + +1) `:type` of exception ex-data +2) Class of exception +3) `:type` ancestors of exception ex-data +4) Super Classes of exception +5) The ::default handler ```clj -(def handler (constantly {:status 200, :body "ok"})) +(require '[reitit.ring.middleware.exception :as exception]) -(def app - (ring/ring-handler - (ring/router - [["/api" - ["/ping" handler] - ["/admin" {::roles #{:admin}} - ["/ping" handler]]]] - {:data {:middleware [wrap-enforce-roles]}}))) +;; type hierarchy +(derive ::error ::exception) +(derive ::failure ::exception) +(derive ::horror ::exception) + +(defn handler [message exception request] + {:status 500 + :body {:message message + :exception (str exception) + :uri (:uri request)}}) + +(exception/create-exception-middleware + (merge + exception/default-handlers + {;; ex-data with :type ::error + ::error (partial handler "error") + + ;; ex-data with ::exception or ::failure + ::exception (partial handler "exception") + + ;; SQLException and all it's child classes + java.sql.SQLException (partial handler "sql-exception") + + ;; override the default handler + ::exception/default (partial handler "default") + + ;; print stack-traces for all exceptions + ::exception/wrap (fn [handler e request] + (.printStackTrace e) + (handler e request))})) ``` -Anonymous access to public route: +## Content Negotiation -```clj -(app {:request-method :get, :uri "/api/ping"}) -; {:status 200, :body "ok"} -``` +Wrapper for [Muuntaja](https://github.com/metosin/muuntaja) middleware for content-negotiation, request decoding and response encoding. Reads configuration from route data and emit's [swagger](swagger.md) `:produces` and `:consumes` definitions automatically. -Anonymous access to guarded route: +## Multipart request handling -```clj -(app {:request-method :get, :uri "/api/admin/ping"}) -; {:status 403, :body "forbidden"} -``` - -Authorized access to guarded route: - -```clj -(app {:request-method :get, :uri "/api/admin/ping", ::roles #{:admin}}) -; {:status 200, :body "ok"} -``` - -Dynamic extensions are nice, but we can do much better. See [data-driven middleware](data_driven_middleware.md) and [compiling routes](compiling_middleware.md). +Wrapper for [Ring Multipart Middleware](https://github.com/ring-clojure/ring/blob/master/ring-core/src/ring/middleware/multipart_params.clj). Conditionally mounts to an endpoint only if it has `:multipart` params defined. Emits swagger `:consumes` definitions automatically. diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj b/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj index ef4fb1b7..1db6e7e4 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj @@ -1,7 +1,10 @@ (ns reitit.ring.middleware.exception (:require [reitit.coercion :as coercion] [reitit.ring :as ring] - [clojure.spec.alpha :as s])) + [clojure.spec.alpha :as s] + [clojure.string :as str]) + (:import (java.time Instant) + (java.io PrintWriter))) (s/def ::handlers (s/map-of any? fn?)) (s/def ::spec (s/keys :opt-un [::handlers])) @@ -28,7 +31,9 @@ (partial get handlers) (super-classes ex-class)) (get handlers ::default))] - (error-handler error request))) + (if-let [wrap (get handlers ::wrap)] + (wrap error-handler error request) + (error-handler error request)))) (defn- on-exception [handlers e request respond raise] (try @@ -36,7 +41,7 @@ (catch Exception e (raise e)))) -(defn- wrap [{:keys [handlers]}] +(defn- wrap [handlers] (fn [handler] (fn ([request] @@ -50,6 +55,9 @@ (catch Throwable e (on-exception handlers e request respond raise))))))) +(defn print! [^PrintWriter writer & more] + (.write writer (str (str/join " " more) "\n"))) + ;; ;; handlers ;; @@ -78,84 +86,92 @@ :headers {"Content-Type" "text/plain"} :body (str "Malformed " (-> e ex-data :format pr-str) " request.")}) +(defn wrap-log-to-console [handler e {:keys [uri request-method] :as req}] + (print! *out* (Instant/now) request-method (pr-str uri) "=>" (.getMessage e)) + (.printStackTrace e *out*) + (handler e req)) + ;; ;; public api ;; -(def default-options - {:handlers {::default default-handler - ::ring/response http-response-handler - :muuntaja/decode request-parsing-handler - ::coercion/request-coercion (create-coercion-handler 400) - ::coercion/response-coercion (create-coercion-handler 500)}}) +(def default-handlers + {::default default-handler + ::ring/response http-response-handler + :muuntaja/decode request-parsing-handler + ::coercion/request-coercion (create-coercion-handler 400) + ::coercion/response-coercion (create-coercion-handler 500)}) (defn wrap-exception - "Ring middleware that catches all exceptions and looks up a - exceptions handler of type `exception request => response` to - handle the exception. - - The following options are supported: - - | key | description - |--------------|------------- - | `:handlers` | A map of exception identifier => exception-handler - - The handler is selected from the handlers by exception idenfiter - in the following lookup order: - - 1) `:type` of exception ex-data - 2) Class of exception - 3) descadents `:type` of exception ex-data - 4) Super Classes of exception - 5) The ::default handler" - [handler options] - (-> options wrap handler)) + ([handler] + (handler default-handlers)) + ([handler options] + (-> options wrap handler))) (def exception-middleware - "Reitit middleware that catches all exceptions and looks up a - exceptions handler of type `exception request => response` to - handle the exception. - - The following options are supported: - - | key | description - |--------------|------------- - | `:handlers` | A map of exception identifier => exception-handler - - The handler is selected from the handlers by exception idenfiter - in the following lookup order: - - 1) `:type` of exception ex-data - 2) Class of exception - 3) descadents `:type` of exception ex-data - 4) Super Classes of exception - 5) The ::default handler" {:name ::exception :spec ::spec - :wrap (wrap default-options)}) + :wrap (wrap default-handlers)}) (defn create-exception-middleware - "Creates a reitit middleware that catches all exceptions and looks up a - exceptions handler of type `exception request => response` to - handle the exception. + "Creates a reitit middleware that catches all exceptions. Takes a map + of `identifier => exception request => response` that is used to select + the exception handler for the thown/raised exception identifier. Exception + idenfier is either a `Keyword` or a Exception Class. - The following options are supported: + The following handlers special handlers are available: | key | description |--------------|------------- - | `:handlers` | A map of exception identifier => exception-handler + | `::default` | a default exception handler if nothing else mathced (default [[default-handler]]). + | `::wrap` | a 3-arity handler to wrap the actual handler `handler exception request => response` - The handler is selected from the handlers by exception idenfiter + The handler is selected from the options map by exception idenfiter in the following lookup order: 1) `:type` of exception ex-data 2) Class of exception - 3) descadents `:type` of exception ex-data + 3) `:type` ancestors of exception ex-data 4) Super Classes of exception - 5) The ::default handler" + 5) The ::default handler + + Example: + + (require '[reitit.ring.middleware.exception :as exception]) + + ;; type hierarchy + (derive ::error ::exception) + (derive ::failure ::exception) + (derive ::horror ::exception) + + (defn handler [message exception request] + {:status 500 + :body {:message message + :exception (str exception) + :uri (:uri request)}}) + + (exception/create-exception-middleware + (merge + exception/default-handlers + {;; ex-data with :type ::error + ::error (partial handler \"error\") + + ;; ex-data with ::exception or ::failure + ::exception (partial handler \"exception\") + + ;; SQLException and all it's child classes + java.sql.SQLException (partial handler \"sql-exception\") + + ;; override the default handler + ::exception/default (partial handler \"default\") + + ;; print stack-traces for all exceptions + ::exception/wrap (fn [handler e request] + (.printStackTrace e) + (handler e request))}))" ([] - (create-exception-middleware default-options)) - ([options] + (create-exception-middleware default-handlers)) + ([handlers] {:name ::exception :spec ::spec - :wrap (wrap options)})) + :wrap (wrap handlers)})) diff --git a/test/clj/reitit/ring/middleware/exception_test.clj b/test/clj/reitit/ring/middleware/exception_test.clj index 9f897c78..ad8c01d7 100644 --- a/test/clj/reitit/ring/middleware/exception_test.clj +++ b/test/clj/reitit/ring/middleware/exception_test.clj @@ -10,23 +10,27 @@ (derive ::kikka ::kukka) (deftest exception-test - (letfn [(create [f] - (ring/ring-handler - (ring/router - [["/defaults" - {:handler f}] - ["/coercion" - {:middleware [reitit.ring.coercion/coerce-request-middleware - reitit.ring.coercion/coerce-response-middleware] - :coercion reitit.coercion.spec/coercion - :parameters {:query {:x int?, :y int?}} - :responses {200 {:body {:total pos-int?}}} - :handler f}]] - {:data {:middleware [(exception/create-exception-middleware - (update - exception/default-options :handlers merge - {::kikka (constantly {:status 200, :body "kikka"}) - SQLException (constantly {:status 200, :body "sql"})}))]}})))] + (letfn [(create + ([f] + (create f nil)) + ([f wrap] + (ring/ring-handler + (ring/router + [["/defaults" + {:handler f}] + ["/coercion" + {:middleware [reitit.ring.coercion/coerce-request-middleware + reitit.ring.coercion/coerce-response-middleware] + :coercion reitit.coercion.spec/coercion + :parameters {:query {:x int?, :y int?}} + :responses {200 {:body {:total pos-int?}}} + :handler f}]] + {:data {:middleware [(exception/create-exception-middleware + (merge + exception/default-handlers + {::kikka (constantly {:status 400, :body "kikka"}) + SQLException (constantly {:status 400, :body "sql"}) + ::exception/wrap wrap}))]}}))))] (testing "normal calls work ok" (let [response {:status 200, :body "ok"} @@ -81,20 +85,32 @@ (testing "exact :type" (let [app (create (fn [_] (throw (ex-info "fail" {:type ::kikka}))))] - (is (= {:status 200, :body "kikka"} + (is (= {:status 400, :body "kikka"} (app {:request-method :get, :uri "/defaults"}))))) (testing "parent :type" (let [app (create (fn [_] (throw (ex-info "fail" {:type ::kukka}))))] - (is (= {:status 200, :body "kikka"} + (is (= {:status 400, :body "kikka"} (app {:request-method :get, :uri "/defaults"}))))) (testing "exact Exception" (let [app (create (fn [_] (throw (SQLException.))))] - (is (= {:status 200, :body "sql"} + (is (= {:status 400, :body "sql"} (app {:request-method :get, :uri "/defaults"}))))) (testing "Exception SuperClass" (let [app (create (fn [_] (throw (SQLWarning.))))] - (is (= {:status 200, :body "sql"} + (is (= {:status 400, :body "sql"} + (app {:request-method :get, :uri "/defaults"}))))) + + (testing "::exception/wrap" + (let [calls (atom 0) + app (create (fn [_] (throw (SQLWarning.))) + (fn [handler exception request] + (if (< (swap! calls inc) 2) + (handler exception request) + {:status 500, :body "too many tries"})))] + (is (= {:status 400, :body "sql"} + (app {:request-method :get, :uri "/defaults"}))) + (is (= {:status 500, :body "too many tries"} (app {:request-method :get, :uri "/defaults"}))))))) From ad0ef978fbb03a7287afa1441f41282c97253d68 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Thu, 2 Aug 2018 16:20:39 +0300 Subject: [PATCH 51/55] middleware docs --- doc/ring/default_middleware.md | 131 ++++++++++++++++++ doc/ring/extra_middleware.md | 88 ------------ .../reitit/ring/middleware/exception_test.clj | 2 +- 3 files changed, 132 insertions(+), 89 deletions(-) create mode 100644 doc/ring/default_middleware.md delete mode 100644 doc/ring/extra_middleware.md diff --git a/doc/ring/default_middleware.md b/doc/ring/default_middleware.md new file mode 100644 index 00000000..f6470b30 --- /dev/null +++ b/doc/ring/default_middleware.md @@ -0,0 +1,131 @@ +# Default Middleware + +```clj +[metosin/reitit-middleware "0.2.0-SNAPSHOT"] +``` + +Any Ring middleware can be used with `reitit-ring`, but using data-driven middleware is preferred as they are easier to manage and in many cases, yield better performance. `reitit-middleware` contains a set of common ring middleware, lifted into data-driven middleware. + +* [Exception handling](#exception-handling) +* [Content negotiation](#content-negotiation) +* [Multipart request handling](#multipart-request-handling) + +## Exception handling + +A polished version of [compojure-api](https://github.com/metosin/compojure-api) exception handling. Catches all exceptions and invokes configured exception handler. + +```clj +(require '[reitit.ring.middleware.exception :as exception]) +``` + +### `exception/exception-middleware` + +A preconfigured middleware using `exception/default-handlers`. Catches: + +* Request & response [Coercion](coercion.md) exceptions +* [Muuntaja](https://github.com/metosin/muuntaja) decode exceptions +* Exceptions with `:type` of `:reitit.ring/response`, returning `:response` key from `ex-data`. +* Safely all other exceptions + +```clj +(require '[reitit.ring :as ring]) + +(def app + (ring/ring-handler + (ring/router + ["/fail" (fn [_] (throw (Exception. "fail")))] + {:data {:middleware [exception/exception-middleware]}}))) + +(app {:request-method :get, :uri "/fail"}) +;{:status 500 +; :body {:type "exception" +; :class "java.lang.Exception"}} +``` + +### `exception/create-exception-middleware` + +Creates the exception-middleware with custom options. Takes a map of `identifier => exception request => response` that is used to select the exception handler for the thown/raised exception identifier. Exception idenfier is either a `Keyword` or a Exception Class. + +The following handlers special keys are available: + +| key | description +|--------------|------------- +| `::default` | a default exception handler if nothing else mathced (default `exception/default-handler`). +| `::wrap` | a 3-arity handler to wrap the actual handler `handler exception request => response` (no default). + +The handler is selected from the options map by exception idenfitifier in the following lookup order: + +1) `:type` of exception ex-data +2) Class of exception +3) `:type` ancestors of exception ex-data +4) Super Classes of exception +5) The ::default handler + +```clj +;; type hierarchy +(derive ::error ::exception) +(derive ::failure ::exception) +(derive ::horror ::exception) + +(defn handler [message exception request] + {:status 500 + :body {:message message + :exception (.getClass exception) + :data (ex-data exception) + :uri (:uri request)}}) + +(def exception-middleware + (exception/create-exception-middleware + (merge + exception/default-handlers + {;; ex-data with :type ::error + ::error (partial handler "error") + + ;; ex-data with ::exception or ::failure + ::exception (partial handler "exception") + + ;; SQLException and all it's child classes + java.sql.SQLException (partial handler "sql-exception") + + ;; override the default handler + ::exception/default (partial handler "default") + + ;; print stack-traces for all exceptions + ::exception/wrap (fn [handler e request] + (println "ERROR" (pr-str (:uri request))) + (handler e request))}))) + +(def app + (ring/ring-handler + (ring/router + ["/fail" (fn [_] (throw (ex-info "fail" {:type ::failue})))] + {:data {:middleware [exception-middleware]}}))) + +(app {:request-method :get, :uri "/fail"}) +; ERROR "/fail" +; => {:status 500, +; :body {:message "default" +; :exception clojure.lang.ExceptionInfo +; :data {:type :user/failue} +; :uri "/fail"}} +``` + +## Content Negotiation + +Wrapper for [Muuntaja](https://github.com/metosin/muuntaja) middleware for content-negotiation, request decoding and response encoding. Reads configuration from route data and emit's [swagger](swagger.md) `:produces` and `:consumes` definitions automatically. + +```clj +(require '[reitit.ring.middleware.muuntaja :as muuntaja]) +``` + +## Multipart request handling + +Wrapper for [Ring Multipart Middleware](https://github.com/ring-clojure/ring/blob/master/ring-core/src/ring/middleware/multipart_params.clj). Conditionally mounts to an endpoint only if it has `:multipart` params defined. Emits swagger `:consumes` definitions automatically. + +```clj +(require '[reitit.ring.middleware.multipart :as multipart]) +``` + +## Example app + +See an example app with the default middleware in action: https://github.com/metosin/reitit/blob/master/examples/ring-swagger/src/example/server.clj. diff --git a/doc/ring/extra_middleware.md b/doc/ring/extra_middleware.md deleted file mode 100644 index 16b7afe9..00000000 --- a/doc/ring/extra_middleware.md +++ /dev/null @@ -1,88 +0,0 @@ -# Default Middleware - -Any Ring middleware can be used with `reitit-ring`, but using data-driven middleware is preferred as they are easier to manage and in many cases, yield better performance. - -To make web development easier, `reitit-middleware` contains a set of common ring middleware, lifted into data-driven middleware. - -```clj -[metosin/reitit-middleware "0.2.0-SNAPSHOT"] -``` - -## Exception handling - -A polished version of [compojure-api](https://github.com/metosin/compojure-api) exception handling. Catches all exceptions and invokes configured exception handler. - -```clj -(require '[reitit.ring.middleware.exception :as exception]) -``` - -### `exception/exception-middleware` - -A preconfigured Middleware using `exception/default-handlers`. Catches: - -* request & response [Coercion](coercion.md) exceptions -* [Muuntaja](https://github.com/metosin/muuntaja) decode exceptions -* Exceptions with `:type` of `:reitit.ring/response`, returning `:response` key from `ex-data`. -* safely all other exceptions - -### `exception/create-exception-middleware` - -Creates a reitit middleware that catches all exceptions. Takes a map of `identifier => exception request => response` that is used to select the exception handler for the thown/raised exception identifier. Exception idenfier is either a `Keyword` or a Exception Class. - -The following handlers special handlers are available: - -| key | description -|--------------|------------- -| `::default` | a default exception handler if nothing else mathced (default `exception/default-handler`). -| `::wrap` | a 3-arity handler to wrap the actual handler `handler exception request => response` (no default). - -The handler is selected from the options map by exception idenfitifier in the following lookup order: - -1) `:type` of exception ex-data -2) Class of exception -3) `:type` ancestors of exception ex-data -4) Super Classes of exception -5) The ::default handler - -```clj -(require '[reitit.ring.middleware.exception :as exception]) - -;; type hierarchy -(derive ::error ::exception) -(derive ::failure ::exception) -(derive ::horror ::exception) - -(defn handler [message exception request] - {:status 500 - :body {:message message - :exception (str exception) - :uri (:uri request)}}) - -(exception/create-exception-middleware - (merge - exception/default-handlers - {;; ex-data with :type ::error - ::error (partial handler "error") - - ;; ex-data with ::exception or ::failure - ::exception (partial handler "exception") - - ;; SQLException and all it's child classes - java.sql.SQLException (partial handler "sql-exception") - - ;; override the default handler - ::exception/default (partial handler "default") - - ;; print stack-traces for all exceptions - ::exception/wrap (fn [handler e request] - (.printStackTrace e) - (handler e request))})) -``` - -## Content Negotiation - -Wrapper for [Muuntaja](https://github.com/metosin/muuntaja) middleware for content-negotiation, request decoding and response encoding. Reads configuration from route data and emit's [swagger](swagger.md) `:produces` and `:consumes` definitions automatically. - -## Multipart request handling - -Wrapper for [Ring Multipart Middleware](https://github.com/ring-clojure/ring/blob/master/ring-core/src/ring/middleware/multipart_params.clj). Conditionally mounts to an endpoint only if it has `:multipart` params defined. Emits swagger `:consumes` definitions automatically. diff --git a/test/clj/reitit/ring/middleware/exception_test.clj b/test/clj/reitit/ring/middleware/exception_test.clj index ad8c01d7..7e13f7c4 100644 --- a/test/clj/reitit/ring/middleware/exception_test.clj +++ b/test/clj/reitit/ring/middleware/exception_test.clj @@ -12,7 +12,7 @@ (deftest exception-test (letfn [(create ([f] - (create f nil)) + (create f nil)) ([f wrap] (ring/ring-handler (ring/router From a9b0a2ef730004558126d50018fa6e786a3cdab4 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Fri, 3 Aug 2018 13:10:16 +0300 Subject: [PATCH 52/55] Update docs --- CHANGELOG.md | 5 +++++ README.md | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e00a3410..6317fd7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -69,6 +69,11 @@ (swagger-ui/create-swagger-ui-handler {:path "/"})) ``` +## `reitit-middleware` + +* A new module with common data-driven middleware: exception handling, content negotiation & multipart requests. See [the docs](https://metosin.github.io/reitit/ring/default_middleware.html). + + ## `reitit-swagger-ui` * **BREAKING**: pass swagger-ui `:config` as-is (instead of mixed-casing keys) to swagger-ui, fixes [#109](https://github.com/metosin/reitit/issues/109): diff --git a/README.md b/README.md index bf836881..f6ed27c5 100644 --- a/README.md +++ b/README.md @@ -20,11 +20,12 @@ See the [full documentation](https://metosin.github.io/reitit/) for details. ## Modules * `reitit-core` - the routing core -* [`reitit-ring`](https://metosin.github.io/reitit/ring/ring.html) with [data-driven middleware](https://metosin.github.io/reitit/ring/data_driven_middleware.html) +* `reitit-ring` - a [ring router](https://metosin.github.io/reitit/ring/ring.html) +* `reitit-middleware` - [common data-driven middleware](https://metosin.github.io/reitit/ring/default_middleware.html) for `reitit-ring` * `reitit-spec` [clojure.spec](https://clojure.org/about/spec) coercion * `reitit-schema` [Schema](https://github.com/plumatic/schema) coercion * `reitit-swagger` [Swagger2](https://swagger.io/) apidocs -* `reitit-swagger-ui` Integrated [Swagger UI](https://github.com/swagger-api/swagger-ui). +* `reitit-swagger-ui` Integrated [Swagger UI](https://github.com/swagger-api/swagger-ui) Bubblin' under: From 0d165e799f43fc01b3f281938957a33633bac0e5 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Fri, 3 Aug 2018 13:31:21 +0300 Subject: [PATCH 53/55] fix docs --- doc/ring/default_middleware.md | 8 ++++---- .../src/reitit/ring/middleware/exception.clj | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/ring/default_middleware.md b/doc/ring/default_middleware.md index f6470b30..8a037def 100644 --- a/doc/ring/default_middleware.md +++ b/doc/ring/default_middleware.md @@ -48,10 +48,10 @@ Creates the exception-middleware with custom options. Takes a map of `identifier The following handlers special keys are available: -| key | description -|--------------|------------- -| `::default` | a default exception handler if nothing else mathced (default `exception/default-handler`). -| `::wrap` | a 3-arity handler to wrap the actual handler `handler exception request => response` (no default). +| key | description +|------------------------|------------- +| `::exception/default` | a default exception handler if nothing else mathced (default `exception/default-handler`). +| `::exception/wrap` | a 3-arity handler to wrap the actual handler `handler exception request => response` (no default). The handler is selected from the options map by exception idenfitifier in the following lookup order: diff --git a/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj b/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj index 1db6e7e4..d89a1c20 100644 --- a/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj +++ b/modules/reitit-middleware/src/reitit/ring/middleware/exception.clj @@ -121,10 +121,10 @@ The following handlers special handlers are available: - | key | description - |--------------|------------- - | `::default` | a default exception handler if nothing else mathced (default [[default-handler]]). - | `::wrap` | a 3-arity handler to wrap the actual handler `handler exception request => response` + | key | description + |------------------------|------------- + | `::exception/default` | a default exception handler if nothing else mathced (default [[default-handler]]). + | `::exception/wrap` | a 3-arity handler to wrap the actual handler `handler exception request => response` The handler is selected from the options map by exception idenfiter in the following lookup order: From af2d7922907beae572aee6ccc87e0ed01926ba39 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sun, 5 Aug 2018 22:53:43 +0300 Subject: [PATCH 54/55] Allows raw specs as parameters --- modules/reitit-core/src/reitit/spec.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/reitit-core/src/reitit/spec.cljc b/modules/reitit-core/src/reitit/spec.cljc index cc0dee44..6e70d867 100644 --- a/modules/reitit-core/src/reitit/spec.cljc +++ b/modules/reitit-core/src/reitit/spec.cljc @@ -74,7 +74,7 @@ ;; coercion ;; -(s/def :reitit.core.coercion/kw-map (s/map-of keyword? any?)) +(s/def :reitit.core.coercion/kw-map (s/or :map (s/map-of keyword? any?) :spec s/spec?)) (s/def :reitit.core.coercion/query :reitit.core.coercion/kw-map) (s/def :reitit.core.coercion/body :reitit.core.coercion/kw-map) From 282fa7f012e4464f21f43813c5762c3c4e645214 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sun, 5 Aug 2018 23:00:59 +0300 Subject: [PATCH 55/55] Read `:headers` from request `:headers`. not `:header-params` --- CHANGELOG.md | 1 + modules/reitit-core/src/reitit/coercion.cljc | 2 +- test/cljc/reitit/ring_coercion_test.cljc | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6317fd7c..3b70436b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ * the `r/routes` returns just the path + data tuples as documented, not the compiled route results. To get the compiled results, use `r/compiled-routes` instead. * new [faster](https://github.com/metosin/reitit/blob/master/perf-test/clj/reitit/impl_perf_test.clj) and more correct encoders and decoders for query & path params. * query-parameters are encoded with `reitit.impl/form-encode`, so spaces are `+` instead of `%20`. +* correctly read `:header` params from request `:headers`, not `:header-params` * welcome route name conflict resolution! If router has routes with same names, router can't be created. fix 'em. * sequential child routes are allowed, enabling this: diff --git a/modules/reitit-core/src/reitit/coercion.cljc b/modules/reitit-core/src/reitit/coercion.cljc index c5e9c07c..d168adb3 100644 --- a/modules/reitit-core/src/reitit/coercion.cljc +++ b/modules/reitit-core/src/reitit/coercion.cljc @@ -38,7 +38,7 @@ {:query (->ParameterCoercion :query-params :string true true) :body (->ParameterCoercion :body-params :body false false) :form (->ParameterCoercion :form-params :string true true) - :header (->ParameterCoercion :header-params :string true true) + :header (->ParameterCoercion :headers :string true true) :path (->ParameterCoercion :path-params :string true true)}) (defn ^:no-doc request-coercion-failed! [result coercion value in request] diff --git a/test/cljc/reitit/ring_coercion_test.cljc b/test/cljc/reitit/ring_coercion_test.cljc index d212a150..82fc5a04 100644 --- a/test/cljc/reitit/ring_coercion_test.cljc +++ b/test/cljc/reitit/ring_coercion_test.cljc @@ -28,7 +28,7 @@ :query-params {"a" "1"} :body-params {:b 2} :form-params {:c 3} - :header-params {:d 4}}) + :headers {"d" "4"}}) (def invalid-request {:uri "/api/plus/5" @@ -40,7 +40,7 @@ :query-params {"a" "1"} :body-params {:b 2} :form-params {:c 3} - :header-params {:d -40}}) + :headers {"d" "-40"}}) (deftest spec-coercion-test (let [create (fn [middleware]