Skip to content
This repository was archived by the owner on Feb 28, 2024. It is now read-only.

Commit 014fedc

Browse files
liamchzhcalvis
andcommitted
Add a full-route key to the request map
This provides access to the full route that contains the common prefix. The full-route info is added to the ':compojure/full-route' key in the request map. Co-authored-by: Liam Chen <liamchzh@gmail.com> Co-authored-by: Claire Alvis <claire.alvis@gmail.com>
1 parent 70d0bf2 commit 014fedc

File tree

2 files changed

+58
-16
lines changed

2 files changed

+58
-16
lines changed

src/compojure/core.clj

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -134,9 +134,17 @@
134134
(defn- wrap-route-info [handler route-info]
135135
(fn
136136
([request]
137-
(handler (assoc request :compojure/route route-info)))
137+
(let [full-route (str (:compojure/context request) (second route-info))]
138+
(handler (assoc request
139+
:compojure/route route-info
140+
:compojure/full-route full-route))))
138141
([request respond raise]
139-
(handler (assoc request :compojure/route route-info) respond raise))))
142+
(let [full-route (str (:compojure/context request) (second route-info))]
143+
(handler (assoc request
144+
:compojure/route route-info
145+
:compojure/full-route full-route)
146+
respond
147+
raise)))))
140148

141149
(defn- wrap-route-matches [handler method path]
142150
(fn
@@ -257,27 +265,39 @@
257265
path (:path-info request uri)
258266
context (or (:context request) "")
259267
subpath (:__path-info params)
260-
params (dissoc params :__path-info)]
268+
params (dissoc params :__path-info)
269+
context-route (:context-route (meta route))]
261270
(-> request
262271
(assoc-route-params (decode-route-params params))
263272
(assoc :path-info (if (= subpath "") "/" subpath)
264-
:context (remove-suffix uri subpath))))))
273+
:context (remove-suffix uri subpath))
274+
(update :compojure/context (fn [ctx] (str ctx context-route)))))))
265275

266276
(defn- context-route [route]
267277
(let [re-context {:__path-info #"|/.*"}]
268278
(cond
269279
(string? route)
270-
(clout/route-compile (str route ":__path-info") re-context)
280+
(with-meta (clout/route-compile (str route ":__path-info") re-context)
281+
{:context-route route})
271282
(and (vector? route) (literal? route))
272-
(clout/route-compile
273-
(str (first route) ":__path-info")
274-
(merge (apply hash-map (rest route)) re-context))
283+
(with-meta (clout/route-compile
284+
(str (first route) ":__path-info")
285+
(merge (apply hash-map (rest route)) re-context))
286+
{:context-route (first route)})
275287
(vector? route)
276-
`(clout/route-compile
277-
(str ~(first route) ":__path-info")
278-
~(merge (apply hash-map (rest route)) re-context))
288+
`(let [route# ~(first route)]
289+
(with-meta
290+
(clout/route-compile
291+
(str route# ":__path-info")
292+
~(merge (apply hash-map (rest route)) re-context))
293+
{:context-route route#}))
279294
:else
280-
`(clout/route-compile (str ~route ":__path-info") ~re-context))))
295+
`(let [route# ~route]
296+
(with-meta
297+
(clout/route-compile (str route# ":__path-info") ~re-context)
298+
(if (string? route#)
299+
{:context-route route#}
300+
{}))))))
281301

282302
(defn ^:no-doc make-context [route make-handler]
283303
(letfn [(handler

test/compojure/core_test.clj

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
(assoc :params {:y "bar"}))]
3939
((GET "/:x" [x :as r]
4040
(is (= x "foo"))
41-
(is (= (dissoc r :params :route-params :compojure/route)
41+
(is (= (dissoc r :params :route-params :compojure/route :compojure/full-route)
4242
(dissoc req :params)))
4343
nil)
4444
req)))
@@ -212,7 +212,7 @@
212212
(let [handler (GET "/ip/:ip" [ip] ip)
213213
cxt-handler (context "/ip/:ip" [ip] (GET "/" [] ip))
214214
in-cxt-handler (context "/ip" [] (GET "/:ip" [ip] ip))
215-
request (mock/request :get "/ip/0%3A0%3A0%3A0%3A0%3A0%3A0%3A1%250") ]
215+
request (mock/request :get "/ip/0%3A0%3A0%3A0%3A0%3A0%3A0%3A1%250")]
216216
(is (= (-> request handler :body) "0:0:0:0:0:0:0:1%0"))
217217
(is (= (-> request cxt-handler :body) "0:0:0:0:0:0:0:1%0"))
218218
(is (= (-> request in-cxt-handler :body) "0:0:0:0:0:0:0:1%0"))))
@@ -221,7 +221,7 @@
221221
(let [handler (GET "/emote/:emote" [emote] emote)
222222
cxt-handler (context "/emote/:emote" [emote] (GET "/" [] emote))
223223
in-cxt-handler (context "/emote" [] (GET "/:emote" [emote] emote))
224-
request (mock/request :get "/emote/%5C%3F%2F") ]
224+
request (mock/request :get "/emote/%5C%3F%2F")]
225225
(is (= (-> request handler :body) "\\?/"))
226226
(is (= (-> request cxt-handler :body) "\\?/"))
227227
(is (= (-> request in-cxt-handler :body) "\\?/"))))
@@ -323,7 +323,29 @@
323323
request (route (mock/request :post "/foo/1" {}))]
324324
(testing "ANY request has matched route information"
325325
(is (= (request :compojure/route)
326-
[:any "/foo/:id"])))))
326+
[:any "/foo/:id"]))
327+
(is (= (request :compojure/full-route)
328+
"/foo/:id"))))
329+
330+
(let [route (context "/foo/:foo-id" [_] (GET "/bar/:bar-id" req req))
331+
request (route (mock/request :get "/foo/1/bar/2"))]
332+
(testing "request has matched route information with path prefix"
333+
(is (= (request :compojure/route)
334+
[:get "/bar/:bar-id"]))
335+
(is (= (request :compojure/context)
336+
"/foo/:foo-id"))
337+
(is (= (request :compojure/full-route)
338+
"/foo/:foo-id/bar/:bar-id"))))
339+
340+
(let [route (context "/foo/:foo-id" [_]
341+
(context "/bar/:bar-id" [_]
342+
(GET "/baz/:baz-id" req req)))
343+
request (route (mock/request :get "/foo/1/bar/2/baz/3"))]
344+
(testing "request has matched route information with multiple path prefix"
345+
(is (= (request :compojure/context)
346+
"/foo/:foo-id/bar/:bar-id"))
347+
(is (= (request :compojure/full-route)
348+
"/foo/:foo-id/bar/:bar-id/baz/:baz-id")))))
327349

328350
(deftest route-async-test
329351
(testing "single route"

0 commit comments

Comments
 (0)