From 97bfafa907742d4e4b79f1f282ca08b4a261009c Mon Sep 17 00:00:00 2001 From: Luca Cervello Date: Fri, 23 Jan 2026 11:20:38 +0100 Subject: [PATCH 1/2] feat: add url-encode? options to path-params --- modules/reitit-core/src/reitit/core.cljc | 31 ++++++++++++++++++------ modules/reitit-core/src/reitit/impl.cljc | 7 ++++-- test/cljc/reitit/core_test.cljc | 6 +++++ test/cljc/reitit/impl_test.cljc | 28 ++++++++++++++++++++- 4 files changed, 62 insertions(+), 10 deletions(-) diff --git a/modules/reitit-core/src/reitit/core.cljc b/modules/reitit-core/src/reitit/core.cljc index 58893e77..6b906a78 100644 --- a/modules/reitit-core/src/reitit/core.cljc +++ b/modules/reitit-core/src/reitit/core.cljc @@ -46,7 +46,7 @@ (options [this]) (route-names [this]) (match-by-path [this path]) - (match-by-name [this name] [this name path-params])) + (match-by-name [this name] [this name path-params] [this name path-params opts])) (defn router? [x] (satisfies? Router x)) @@ -124,7 +124,10 @@ (match nil))) (match-by-name [_ name path-params] (if-let [match (impl/fast-get lookup name)] - (match (impl/path-params path-params)))))))) + (match (impl/path-params path-params)))) + (match-by-name [_ name path-params opts] + (if-let [match (impl/fast-get lookup name)] + (match (impl/path-params path-params opts)))))))) (defn lookup-router "Creates a lookup-router from resolved routes and optional @@ -163,7 +166,10 @@ (match nil))) (match-by-name [_ name path-params] (if-let [match (impl/fast-get lookup name)] - (match (impl/path-params path-params)))))))) + (match (impl/path-params path-params)))) + (match-by-name [_ name path-params opts] + (if-let [match (impl/fast-get lookup name)] + (match (impl/path-params path-params opts)))))))) (defn trie-router "Creates a special prefix-tree router from resolved routes and optional @@ -210,7 +216,10 @@ (match nil))) (match-by-name [_ name path-params] (if-let [match (impl/fast-get lookup name)] - (match (impl/path-params path-params)))))))) + (match (impl/path-params path-params)))) + (match-by-name [_ name path-params opts] + (if-let [match (impl/fast-get lookup name)] + (match (impl/path-params path-params opts)))))))) (defn single-static-path-router "Creates a fast router of 1 static route(s) and optional @@ -239,7 +248,9 @@ (match-by-name [_ name] (if (= n name) match)) (match-by-name [_ name path-params] - (if (= n name) (impl/fast-assoc match :path-params (impl/path-params path-params)))))))) + (if (= n name) (impl/fast-assoc match :path-params (impl/path-params path-params)))) + (match-by-name [_ name path-params opts] + (if (= n name) (impl/fast-assoc match :path-params (impl/path-params path-params opts)))))))) (defn mixed-router "Creates two routers: [[lookup-router]] or [[single-static-path-router]] for @@ -270,7 +281,10 @@ (match-by-name wildcard-router name))) (match-by-name [_ name path-params] (or (match-by-name static-router name path-params) - (match-by-name wildcard-router name path-params))))))) + (match-by-name wildcard-router name path-params))) + (match-by-name [_ name path-params opts] + (or (match-by-name static-router name path-params opts) + (match-by-name wildcard-router name path-params opts))))))) (defn quarantine-router "Creates two routers: [[mixed-router]] for non-conflicting routes @@ -301,7 +315,10 @@ (match-by-name linear-router name))) (match-by-name [_ name path-params] (or (match-by-name mixed-router name path-params) - (match-by-name linear-router name path-params))))))) + (match-by-name linear-router name path-params))) + (match-by-name [_ name path-params opts] + (or (match-by-name mixed-router name path-params opts) + (match-by-name linear-router name path-params opts))))))) ;; ;; Creating Routers diff --git a/modules/reitit-core/src/reitit/impl.cljc b/modules/reitit-core/src/reitit/impl.cljc index 30c39ec2..efa5a556 100644 --- a/modules/reitit-core/src/reitit/impl.cljc +++ b/modules/reitit-core/src/reitit/impl.cljc @@ -297,8 +297,11 @@ (defn path-params "Convert parameters' values into URL-encoded strings, suitable for URL paths" - [params] - (maybe-map-values #(url-encode (into-string %)) params)) + ([params] (maybe-map-values #(url-encode (into-string %)) params)) + ([params {:keys [url-encode?] :or {url-encode? true}}] + (if url-encode? + (path-params params) + (maybe-map-values #(into-string %) params)))) (defn- query-parameter [k v] (str (form-encode (into-string k)) diff --git a/test/cljc/reitit/core_test.cljc b/test/cljc/reitit/core_test.cljc index 0be783f0..8f8ee759 100644 --- a/test/cljc/reitit/core_test.cljc +++ b/test/cljc/reitit/core_test.cljc @@ -33,6 +33,12 @@ :path "/api/ipa/large" :path-params {:size "large"}}) (r/match-by-name router ::beer {:size "large"}))) + (is (= (r/map->Match + {:template "/api/ipa/:size" + :data {:name ::beer} + :path "/api/ipa/:large" + :path-params {:size ":large"}}) + (r/match-by-name router ::beer {:size ":large"} {:url-encode? false}))) (is (= (r/map->Match {:template "/api/ipa/:size" :data {:name ::beer} diff --git a/test/cljc/reitit/impl_test.cljc b/test/cljc/reitit/impl_test.cljc index c4ae1a39..41da5614 100644 --- a/test/cljc/reitit/impl_test.cljc +++ b/test/cljc/reitit/impl_test.cljc @@ -41,7 +41,33 @@ :u #uuid "c2541900-17a7-4353-9024-db8ac258ba4e" :k :kikka :qk ::kikka - :nil nil})))) + :nil nil}))) + (is (= {:n "1" + :n1 "-1" + :n2 "1" + :n3 "1" + :n4 "1" + :n5 "1" + :d "2.2" + :b "true" + :s "kikka" + :u "c2541900-17a7-4353-9024-db8ac258ba4e" + :k "kikka" + :qk "reitit.impl-test/kikka" + :nil nil} + (impl/path-params {:n 1 + :n1 -1 + :n2 (long 1) + :n3 (int 1) + :n4 (short 1) + :n5 (byte 1) + :d 2.2 + :b true + :s "kikka" + :u #uuid "c2541900-17a7-4353-9024-db8ac258ba4e" + :k :kikka + :qk ::kikka + :nil nil} {:url-encode? false})))) (deftest query-params-test (are [x y] From 4c8a69c6162b6ca9cd351652d7d5a41c6a284e15 Mon Sep 17 00:00:00 2001 From: Luca Cervello Date: Fri, 6 Feb 2026 12:01:44 +0100 Subject: [PATCH 2/2] refactor: remove repetitions --- modules/reitit-core/src/reitit/core.cljc | 29 ++++++++++-------------- modules/reitit-core/src/reitit/impl.cljc | 4 ++-- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/modules/reitit-core/src/reitit/core.cljc b/modules/reitit-core/src/reitit/core.cljc index 6b906a78..d56f3bbb 100644 --- a/modules/reitit-core/src/reitit/core.cljc +++ b/modules/reitit-core/src/reitit/core.cljc @@ -122,9 +122,8 @@ (match-by-name [_ name] (if-let [match (impl/fast-get lookup name)] (match nil))) - (match-by-name [_ name path-params] - (if-let [match (impl/fast-get lookup name)] - (match (impl/path-params path-params)))) + (match-by-name [r name path-params] + (match-by-name r name path-params nil)) (match-by-name [_ name path-params opts] (if-let [match (impl/fast-get lookup name)] (match (impl/path-params path-params opts)))))))) @@ -164,9 +163,8 @@ (match-by-name [_ name] (if-let [match (impl/fast-get lookup name)] (match nil))) - (match-by-name [_ name path-params] - (if-let [match (impl/fast-get lookup name)] - (match (impl/path-params path-params)))) + (match-by-name [r name path-params] + (match-by-name r name path-params nil)) (match-by-name [_ name path-params opts] (if-let [match (impl/fast-get lookup name)] (match (impl/path-params path-params opts)))))))) @@ -214,9 +212,8 @@ (match-by-name [_ name] (if-let [match (impl/fast-get lookup name)] (match nil))) - (match-by-name [_ name path-params] - (if-let [match (impl/fast-get lookup name)] - (match (impl/path-params path-params)))) + (match-by-name [r name path-params] + (match-by-name r name path-params nil)) (match-by-name [_ name path-params opts] (if-let [match (impl/fast-get lookup name)] (match (impl/path-params path-params opts)))))))) @@ -247,8 +244,8 @@ (if (#?(:clj .equals :cljs =) p path) match)) (match-by-name [_ name] (if (= n name) match)) - (match-by-name [_ name path-params] - (if (= n name) (impl/fast-assoc match :path-params (impl/path-params path-params)))) + (match-by-name [r name path-params] + (match-by-name r name path-params nil)) (match-by-name [_ name path-params opts] (if (= n name) (impl/fast-assoc match :path-params (impl/path-params path-params opts)))))))) @@ -279,9 +276,8 @@ (match-by-name [_ name] (or (match-by-name static-router name) (match-by-name wildcard-router name))) - (match-by-name [_ name path-params] - (or (match-by-name static-router name path-params) - (match-by-name wildcard-router name path-params))) + (match-by-name [r name path-params] + (match-by-name r name path-params nil)) (match-by-name [_ name path-params opts] (or (match-by-name static-router name path-params opts) (match-by-name wildcard-router name path-params opts))))))) @@ -313,9 +309,8 @@ (match-by-name [_ name] (or (match-by-name mixed-router name) (match-by-name linear-router name))) - (match-by-name [_ name path-params] - (or (match-by-name mixed-router name path-params) - (match-by-name linear-router name path-params))) + (match-by-name [r name path-params] + (match-by-name r name path-params nil)) (match-by-name [_ name path-params opts] (or (match-by-name mixed-router name path-params opts) (match-by-name linear-router name path-params opts))))))) diff --git a/modules/reitit-core/src/reitit/impl.cljc b/modules/reitit-core/src/reitit/impl.cljc index efa5a556..5e40e01e 100644 --- a/modules/reitit-core/src/reitit/impl.cljc +++ b/modules/reitit-core/src/reitit/impl.cljc @@ -297,10 +297,10 @@ (defn path-params "Convert parameters' values into URL-encoded strings, suitable for URL paths" - ([params] (maybe-map-values #(url-encode (into-string %)) params)) + ([params] (path-params params nil)) ([params {:keys [url-encode?] :or {url-encode? true}}] (if url-encode? - (path-params params) + (maybe-map-values #(url-encode (into-string %)) params) (maybe-map-values #(into-string %) params)))) (defn- query-parameter [k v]