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

Commit 9a1ca46

Browse files
committed
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.
1 parent d8f39af commit 9a1ca46

File tree

2 files changed

+46
-20
lines changed

2 files changed

+46
-20
lines changed

src/compojure/core.clj

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -134,9 +134,11 @@
134134
(defn- wrap-route-info [handler route-info]
135135
(fn
136136
([request]
137-
(handler (assoc request :compojure/route route-info)))
137+
(handler (assoc request :compojure/route route-info
138+
:compojure/full-route (str (:compojure/context request) (second route-info)))))
138139
([request respond raise]
139-
(handler (assoc request :compojure/route route-info) respond raise))))
140+
(handler (assoc request :compojure/route route-info
141+
:compojure/full-route (str (:compojure/context request) (second route-info)) respond raise)))))
140142

141143
(defn- wrap-route-matches [handler method path]
142144
(fn
@@ -257,27 +259,37 @@
257259
path (:path-info request uri)
258260
context (or (:context request) "")
259261
subpath (:__path-info params)
260-
params (dissoc params :__path-info)]
262+
params (dissoc params :__path-info)
263+
context-route (:context-route (meta route))]
261264
(-> request
262265
(assoc-route-params (decode-route-params params))
263266
(assoc :path-info (if (= subpath "") "/" subpath)
264-
:context (remove-suffix uri subpath))))))
267+
:context (remove-suffix uri subpath)
268+
:compojure/context (str (:compojure/context request) context-route))))))
265269

266270
(defn- context-route [route]
267271
(let [re-context {:__path-info #"|/.*"}]
268-
(cond
269-
(string? route)
270-
(clout/route-compile (str route ":__path-info") re-context)
271-
(and (vector? route) (literal? route))
272-
(clout/route-compile
273-
(str (first route) ":__path-info")
274-
(merge (apply hash-map (rest route)) re-context))
275-
(vector? route)
276-
`(clout/route-compile
277-
(str ~(first route) ":__path-info")
278-
~(merge (apply hash-map (rest route)) re-context))
279-
:else
280-
`(clout/route-compile (str ~route ":__path-info") ~re-context))))
272+
(cond
273+
(string? route)
274+
(with-meta (clout/route-compile (str route ":__path-info") re-context) {:context-route route})
275+
(and (vector? route) (literal? route))
276+
(with-meta (clout/route-compile
277+
(str (first route) ":__path-info")
278+
(merge (apply hash-map (rest route)) re-context)) {:context-route (first route)})
279+
(vector? route)
280+
`(let [uncompiled-route# ~(first route)]
281+
(with-meta
282+
(clout/route-compile
283+
(str uncompiled-route# ":__path-info")
284+
~(merge (apply hash-map (rest route)) re-context))
285+
{:context-route uncompiled-route#}))
286+
:else
287+
`(let [path# ~route]
288+
(with-meta
289+
(clout/route-compile (str path# ":__path-info") ~re-context)
290+
(if (string? path#)
291+
{:context-route path#}
292+
{}))))))
281293

282294
(defn ^:no-doc make-context [route make-handler]
283295
(letfn [(handler

test/compojure/core_test.clj

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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,21 @@
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+
328+
(let [route (context "/foo/:foo-id" [_] (GET "/bar/:bar-id" req req))
329+
request (route (mock/request :get "/foo/1/bar/2"))]
330+
(testing "request has matched route information with path prefix"
331+
(is (= (request :compojure/full-route)
332+
"/foo/:foo-id/bar/:bar-id"))))
333+
334+
(let [route (context "/foo/:foo-id" [_]
335+
(context "/bar/:bar-id" [_]
336+
(GET "/baz/:baz-id" req req)))
337+
request (route (mock/request :get "/foo/1/bar/2/baz/3"))]
338+
(testing "request has matched route information with multiple path prefix"
339+
(is (= (request :compojure/full-route)
340+
"/foo/:foo-id/bar/:bar-id/baz/:baz-id")))))
327341

328342
(deftest route-async-test
329343
(testing "single route"

0 commit comments

Comments
 (0)