Skip to content

Commit 2dc42f8

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 2dc42f8

File tree

2 files changed

+41
-9
lines changed

2 files changed

+41
-9
lines changed

src/compojure/core.clj

Lines changed: 17 additions & 7 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-path 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-path 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
@@ -251,7 +259,7 @@
251259
(defn- remove-suffix [path suffix]
252260
(subs path 0 (- (count path) (count suffix))))
253261

254-
(defn- context-request [request route]
262+
(defn- context-request [request route context-path]
255263
(if-let [params (clout/route-matches route request)]
256264
(let [uri (:uri request)
257265
path (:path-info request uri)
@@ -261,7 +269,8 @@
261269
(-> request
262270
(assoc-route-params (decode-route-params params))
263271
(assoc :path-info (if (= subpath "") "/" subpath)
264-
:context (remove-suffix uri subpath))))))
272+
:context (remove-suffix uri subpath))
273+
(update :compojure/context-path (fn [ctx] (str ctx context-path)))))))
265274

266275
(defn- context-route [route]
267276
(let [re-context {:__path-info #"|/.*"}]
@@ -279,7 +288,7 @@
279288
:else
280289
`(clout/route-compile (str ~route ":__path-info") ~re-context))))
281290

282-
(defn ^:no-doc make-context [route make-handler]
291+
(defn ^:no-doc make-context [route path make-handler]
283292
(letfn [(handler
284293
([request]
285294
(when-let [context-handler (make-handler request)]
@@ -292,10 +301,10 @@
292301
handler
293302
(fn
294303
([request]
295-
(if-let [request (context-request request route)]
304+
(if-let [request (context-request request route path)]
296305
(handler request)))
297306
([request respond raise]
298-
(if-let [request (context-request request route)]
307+
(if-let [request (context-request request route path)]
299308
(handler request respond raise)
300309
(respond nil)))))))
301310

@@ -311,6 +320,7 @@
311320
[path args & routes]
312321
`(make-context
313322
~(context-route path)
323+
~path
314324
(fn [request#]
315325
(let-request [~args request#]
316326
(routes ~@routes)))))

test/compojure/core_test.clj

Lines changed: 24 additions & 2 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)))
@@ -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-path)
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-path)
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)