Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a full-route key to the request map #210

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
31 changes: 21 additions & 10 deletions src/compojure/core.clj
Original file line number Diff line number Diff line change
Expand Up @@ -132,11 +132,20 @@
(handler request respond raise)))))

(defn- wrap-route-info [handler route-info]
(fn
([request]
(handler (assoc request :compojure/route route-info)))
([request respond raise]
(handler (assoc request :compojure/route route-info) respond raise))))
(let [[_ path] route-info]
(fn
([request]
(let [full-route (str (:compojure/route-context request) path)]
(handler (assoc request
:compojure/route route-info
:compojure/full-route full-route))))
([request respond raise]
(let [full-route (str (:compojure/route-context request) path)]
(handler (assoc request
:compojure/route route-info
:compojure/full-route full-route)
respond
raise))))))

(defn- wrap-route-matches [handler method path]
(fn
Expand Down Expand Up @@ -251,7 +260,7 @@
(defn- remove-suffix [path suffix]
(subs path 0 (- (count path) (count suffix))))

(defn- context-request [request route]
(defn- context-request [request route route-context]
(if-let [params (clout/route-matches route request)]
(let [uri (:uri request)
path (:path-info request uri)
Expand All @@ -261,7 +270,8 @@
(-> request
(assoc-route-params (decode-route-params params))
(assoc :path-info (if (= subpath "") "/" subpath)
:context (remove-suffix uri subpath))))))
:context (remove-suffix uri subpath))
(update :compojure/route-context str route-context)))))

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

(defn ^:no-doc make-context [route make-handler]
(defn ^:no-doc make-context [route path make-handler]
(letfn [(handler
([request]
(when-let [context-handler (make-handler request)]
Expand All @@ -292,10 +302,10 @@
handler
(fn
([request]
(if-let [request (context-request request route)]
(if-let [request (context-request request route path)]
(handler request)))
([request respond raise]
(if-let [request (context-request request route)]
(if-let [request (context-request request route path)]
(handler request respond raise)
(respond nil)))))))

Expand All @@ -311,6 +321,7 @@
[path args & routes]
`(make-context
~(context-route path)
~path
(fn [request#]
(let-request [~args request#]
(routes ~@routes)))))
Expand Down
30 changes: 28 additions & 2 deletions test/compojure/core_test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,11 @@
(assoc :params {:y "bar"}))]
((GET "/:x" [x :as r]
(is (= x "foo"))
(is (= (dissoc r :params :route-params :compojure/route)
(is (= (dissoc r
:params
:route-params
:compojure/route
:compojure/full-route)
(dissoc req :params)))
nil)
req)))
Expand Down Expand Up @@ -323,7 +327,29 @@
request (route (mock/request :post "/foo/1" {}))]
(testing "ANY request has matched route information"
(is (= (request :compojure/route)
[:any "/foo/:id"])))))
[:any "/foo/:id"]))
(is (= (request :compojure/full-route)
"/foo/:id"))))

(let [route (context "/foo/:foo-id" [_] (GET "/bar/:bar-id" req req))
request (route (mock/request :get "/foo/1/bar/2"))]
(testing "request has matched route information with path prefix"
(is (= (request :compojure/route)
[:get "/bar/:bar-id"]))
(is (= (request :compojure/route-context)
"/foo/:foo-id"))
(is (= (request :compojure/full-route)
"/foo/:foo-id/bar/:bar-id"))))

(let [route (context "/foo/:foo-id" [_]
(context "/bar/:bar-id" [_]
(GET "/baz/:baz-id" req req)))
request (route (mock/request :get "/foo/1/bar/2/baz/3"))]
(testing "request has matched route information with multiple path prefix"
(is (= (request :compojure/route-context)
"/foo/:foo-id/bar/:bar-id"))
(is (= (request :compojure/full-route)
"/foo/:foo-id/bar/:bar-id/baz/:baz-id")))))

(deftest route-async-test
(testing "single route"
Expand Down