Skip to content

Commit

Permalink
Fixed bug in POST requests to nested routes, reported by Daniel E. Re…
Browse files Browse the repository at this point in the history
…nfer
  • Loading branch information
weavejester committed Apr 23, 2009
1 parent 32d41fa commit a5e294c
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 40 deletions.
46 changes: 22 additions & 24 deletions src/compojure/http/request.clj
Expand Up @@ -36,9 +36,8 @@
(defn get-query-params
"Parse parameters from the query string."
[request]
(merge (request :query-params {})
(if-let [query (request :query-string)]
(parse-params query #"&"))))
(if-let [query (request :query-string)]
(parse-params query #"&")))

(defn get-character-encoding
"Get the character encoding, or use the default from duck-streams."
Expand All @@ -61,31 +60,32 @@
(defn get-form-params
"Parse urlencoded form parameters from the request body."
[request]
(merge (request :form-params {})
(if (urlencoded-form? request)
(if-let [body (slurp-body request)]
(parse-params body #"&")))))
(if (urlencoded-form? request)
(if-let [body (slurp-body request)]
(parse-params body #"&"))))

(defn get-route-params
"Get a map of the route parameters, or nil if not a map."
(defn- get-merged-params
"Get a map of all the parameters merged together."
[request]
(let [params (request :route-params)]
(if (map? params)
params)))
(merge (:query-params request)
(:form-params request)
(:params request)))

(defn- assoc-func
"Associate the result of a (func request) with a key on the request map."
[request key func]
(if (contains? request key)
request
(assoc request key (or (func request) {}))))

(defn assoc-params
"Associate urlencoded parameters with a request. The following keys are added
to the request map: :query-params, :form-params and :params."
[request]
(let [query-params (get-query-params request)
form-params (get-form-params request)
params (merge (request :params)
form-params
query-params)]
(merge request
{:query-params query-params
:form-params form-params
:params params})))
(-> request
(assoc-func :query-params get-query-params)
(assoc-func :form-params get-form-params)
(assoc-func :params get-merged-params)))

(defn with-params
"Decorator that adds urlencoded parameters to the request map."
Expand All @@ -102,9 +102,7 @@
(defn assoc-cookies
"Associate cookies with a request map."
[request]
(if (contains? request :cookies)
request
(assoc request :cookies (get-cookies request))))
(assoc-func request :cookies get-cookies))

(defn with-cookies
"Decorator that adds cookies to a request map."
Expand Down
25 changes: 9 additions & 16 deletions test/compojure/http/request.clj
Expand Up @@ -17,14 +17,6 @@
(is (= (get-query-params {:query-string "a=1%202"})
{:a "1 2"})))

(deftest query-params-empty
(is (= (get-query-params {}) {})))

(deftest query-params-merge
(let [request {:query-params {:a "1"}, :query-string "b=2"}]
(is (= (get-query-params request)
{:a "1", :b "2"}))))

(deftest urlencoded-charset
(is (urlencoded-form?
{:content-type "application/x-www-form-urlencoded; charset=UTF8"})))
Expand All @@ -34,18 +26,19 @@
"a=1" {:a "1"}
"a=1&b=2" {:a "1", :b "2"}))

(deftest form-params-empty
(is (= (get-form-params {}) {})))
(deftest assoc-params-empty
(is (= (assoc-params {})
{:form-params {}, :query-params {}, :params {}})))

(deftest form-params-merge
(let [request (merge {:form-params {:a "1"}} (form-request "b=2"))]
(is (= (get-form-params request)
{:a "1", :b "2"}))))
(deftest assoc-params-merge
(let [request {:form-params {:a "1"}, :query-params {:b "2"}}]
(is (= (assoc-params request)
(assoc request :params {:a "1", :b "2"})))))

(deftest assoc-params-twice
(let [request (form-request "a=1")]
(is (= (:form-params (assoc-params request))
(:form-params (assoc-params request))))))
(is (= (:form-params (-> request assoc-params assoc-params))
{:a "1"}))))

(deftest request-cookies
(is (= (get-cookies {:headers {"cookie" "a=1;b=2"}})
Expand Down

0 comments on commit a5e294c

Please sign in to comment.