Skip to content

Commit 39c4a7d

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. We use :compojure/route to get the route info and add it to the attributes of our metrics and traces, but when compojure.core/context is used, we are not able to get the parameters that are not instantiated. This change adds :compojure/full-route key that serves similarly as the existing :compojure/route does - the only difference is that the new key has a common prefix. Co-authored-by: Liam Chen <liamchzh@gmail.com> Co-authored-by: Claire Alvis <claire.alvis@gmail.com>
1 parent d8f39af commit 39c4a7d

File tree

2 files changed

+49
-12
lines changed

2 files changed

+49
-12
lines changed

src/compojure/core.clj

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,20 @@
132132
(handler request respond raise)))))
133133

134134
(defn- wrap-route-info [handler route-info]
135-
(fn
136-
([request]
137-
(handler (assoc request :compojure/route route-info)))
138-
([request respond raise]
139-
(handler (assoc request :compojure/route route-info) respond raise))))
135+
(let [[_ path] route-info]
136+
(fn
137+
([request]
138+
(let [full-route (str (:compojure/route-context request) path)]
139+
(handler (assoc request
140+
:compojure/route route-info
141+
:compojure/full-route full-route))))
142+
([request respond raise]
143+
(let [full-route (str (:compojure/route-context request) path)]
144+
(handler (assoc request
145+
:compojure/route route-info
146+
:compojure/full-route full-route)
147+
respond
148+
raise))))))
140149

141150
(defn- wrap-route-matches [handler method path]
142151
(fn
@@ -251,7 +260,7 @@
251260
(defn- remove-suffix [path suffix]
252261
(subs path 0 (- (count path) (count suffix))))
253262

254-
(defn- context-request [request route]
263+
(defn- context-request [request route context-path]
255264
(if-let [params (clout/route-matches route request)]
256265
(let [uri (:uri request)
257266
path (:path-info request uri)
@@ -261,7 +270,8 @@
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/route-context str context-path)))))
265275

266276
(defn- context-route [route]
267277
(let [re-context {:__path-info #"|/.*"}]
@@ -279,7 +289,7 @@
279289
:else
280290
`(clout/route-compile (str ~route ":__path-info") ~re-context))))
281291

282-
(defn ^:no-doc make-context [route make-handler]
292+
(defn ^:no-doc make-context [route path make-handler]
283293
(letfn [(handler
284294
([request]
285295
(when-let [context-handler (make-handler request)]
@@ -292,10 +302,10 @@
292302
handler
293303
(fn
294304
([request]
295-
(if-let [request (context-request request route)]
305+
(if-let [request (context-request request route path)]
296306
(handler request)))
297307
([request respond raise]
298-
(if-let [request (context-request request route)]
308+
(if-let [request (context-request request route path)]
299309
(handler request respond raise)
300310
(respond nil)))))))
301311

@@ -311,6 +321,7 @@
311321
[path args & routes]
312322
`(make-context
313323
~(context-route path)
324+
~path
314325
(fn [request#]
315326
(let-request [~args request#]
316327
(routes ~@routes)))))

test/compojure/core_test.clj

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,11 @@
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
42+
:params
43+
:route-params
44+
:compojure/route
45+
:compojure/full-route)
4246
(dissoc req :params)))
4347
nil)
4448
req)))
@@ -323,7 +327,29 @@
323327
request (route (mock/request :post "/foo/1" {}))]
324328
(testing "ANY request has matched route information"
325329
(is (= (request :compojure/route)
326-
[:any "/foo/:id"])))))
330+
[:any "/foo/:id"]))
331+
(is (= (request :compojure/full-route)
332+
"/foo/:id"))))
333+
334+
(let [route (context "/foo/:foo-id" [_] (GET "/bar/:bar-id" req req))
335+
request (route (mock/request :get "/foo/1/bar/2"))]
336+
(testing "request has matched route information with path prefix"
337+
(is (= (request :compojure/route)
338+
[:get "/bar/:bar-id"]))
339+
(is (= (request :compojure/route-context)
340+
"/foo/:foo-id"))
341+
(is (= (request :compojure/full-route)
342+
"/foo/:foo-id/bar/:bar-id"))))
343+
344+
(let [route (context "/foo/:foo-id" [_]
345+
(context "/bar/:bar-id" [_]
346+
(GET "/baz/:baz-id" req req)))
347+
request (route (mock/request :get "/foo/1/bar/2/baz/3"))]
348+
(testing "request has matched route information with multiple path prefix"
349+
(is (= (request :compojure/route-context)
350+
"/foo/:foo-id/bar/:bar-id"))
351+
(is (= (request :compojure/full-route)
352+
"/foo/:foo-id/bar/:bar-id/baz/:baz-id")))))
327353

328354
(deftest route-async-test
329355
(testing "single route"

0 commit comments

Comments
 (0)