Decode path-params on match-by-name, fixes #192

This commit is contained in:
Tommi Reiman 2018-12-21 20:17:46 +02:00
parent 0b9c72ab0f
commit 260b167853
3 changed files with 6 additions and 3 deletions

View file

@ -3,6 +3,7 @@
## `reitit-core`
* `segment-router` doesn't accept empty segments as path-parameters, fixes [#181](https://github.com/metosin/reitit/issues/181).
* path-params are decoded correctly with `r/match-by-name`, fixes [#192](https://github.com/metosin/reitit/issues/192).
## 0.2.9 (2018-11-21)

View file

@ -176,7 +176,7 @@
(fn [[pl nl] [p {:keys [name] :as data} result]]
(let [{:keys [path-params] :as route} (impl/create [p data result])
f #(if-let [path (impl/path-for route %)]
(->Match p data result % path)
(->Match p data result (impl/url-decode-coll %) path)
(->PartialMatch p data result % path-params))]
[(conj pl route)
(if name (assoc nl name f) nl)]))
@ -266,7 +266,7 @@
(fn [[pl nl] [p {:keys [name] :as data} result]]
(let [{:keys [path-params] :as route} (impl/create [p data result])
f #(if-let [path (impl/path-for route %)]
(->Match p data result % path)
(->Match p data result (impl/url-decode-coll %) path)
(->PartialMatch p data result % path-params))]
[(segment/insert pl p (->Match p data result nil nil))
(if name (assoc nl name f) nl)]))

View file

@ -52,12 +52,14 @@
(r/match-by-name! router ::beer))))))
(testing "decode %-encoded path params"
(let [router (r/router [["/one-param-path/:param1"]
(let [router (r/router [["/one-param-path/:param1" ::one]
["/two-param-path/:param1/:param2"]
["/catchall/*remaining-path"]] {:router r})
decoded-params #(-> router (r/match-by-path %) :path-params)
decoded-param1 #(-> (decoded-params %) :param1)
decoded-remaining-path #(-> (decoded-params %) :remaining-path)]
(is (= {:param1 "käki"} (:path-params (r/match-by-name router ::one {:param1 "käki"}))))
(is (= "/one-param-path/k%C3%A4ki" (:path (r/match-by-name router ::one {:param1 "käki"}))))
(is (= "foo bar" (decoded-param1 "/one-param-path/foo%20bar")))
(is (= {:param1 "foo bar" :param2 "baz qux"} (decoded-params "/two-param-path/foo%20bar/baz%20qux")))
(is (= "foo bar" (decoded-remaining-path "/catchall/foo%20bar")))