Permalink
Browse files

Generalize wrap-params interface and add tests.

  • Loading branch information...
1 parent 99f5c27 commit f666802432d04009a600ac6e4ac886b9611a62f8 @mmcgrana committed Dec 25, 2009
Showing with 45 additions and 13 deletions.
  1. +11 −12 src/ring/middleware/params.clj
  2. +32 −0 test/ring/middleware/params_test.clj
  3. +2 −1 test/run.clj
View
23 src/ring/middleware/params.clj
@@ -5,7 +5,7 @@
(:import java.net.URLDecoder))
(defn- urldecode
- "Decode a urlencoded string using the *encoding* var."
+ "Decode a urlencoded string using the specified encoding."
[text encoding]
(URLDecoder/decode text encoding))
@@ -44,7 +44,7 @@
(defn- urlencoded-form?
"Does a request have a urlencoded form?"
[request]
- (if-let [type (:content-type request)]
+ (if-let [#^String type (:content-type request)]
(.startsWith type "application/x-www-form-urlencoded")))
(defn- assoc-form-params
@@ -62,13 +62,12 @@
:query-params - a map of parameters from the query string
:form-params - a map of parameters from the body
:params - a merged map of both query and form parameters
- Takes an optional argument to specify the encoding of the parameters.
- Defaults to UTF-8."
- ([handler]
- (wrap-params handler "UTF-8"))
- ([handler encoding]
- (fn [request]
- (-> request
- (assoc-form-params encoding)
- (assoc-query-params encoding)
- handler))))
+ Takes an optional configuration map. Recognized keys are:
+ :encoding - encoding to use for url-decoding (default: \"UTF-8\")"
+ [handler & [opts]]
+ (let [encoding (get opts :encoding "UTF-8")]
+ (fn [request]
+ (-> request
+ (assoc-form-params encoding)
+ (assoc-query-params encoding)
+ handler))))
View
32 test/ring/middleware/params_test.clj
@@ -0,0 +1,32 @@
+(ns ring.middleware.params-test
+ (:use (clj-unit core)
+ (ring.middleware params))
+ (:import (java.io ByteArrayInputStream)))
+
+(defn- str-input-stream [#^String s]
+ (ByteArrayInputStream. (.getBytes s)))
+
+(def wrapped-echo (wrap-params identity))
+
+(deftest "wrap-params: query-params only"
+ (let [req {:query-string "foo=bar&biz=bat%25"}
+ resp (wrapped-echo req)]
+ (assert= {"foo" "bar" "biz" "bat%"} (:query-params resp))
+ (assert-nil (:form-params resp))
+ (assert= {"foo" "bar" "biz" "bat%"} (:params resp))))
+
+(deftest "wrap-params: query-params and form-params"
+ (let [req {:query-string "foo=bar"
+ :content-type "application/x-www-form-urlencoded"
+ :body (str-input-stream "biz=bat%25")}
+ resp (wrapped-echo req)]
+ (assert= {"foo" "bar"} (:query-params resp))
+ (assert= {"biz" "bat%"} (:form-params resp))
+ (assert= {"foo" "bar" "biz" "bat%"} (:params resp))))
+
+(deftest "wrap-params: not form encoded"
+ (let [req {:content-type "application/json"
+ :body (str-input-stream "{foo: \"bar\"}")}
+ resp (wrapped-echo req)]
+ (assert-nil (:form-params resp))
+ (assert-nil (:params resp))))
View
3 test/run.clj
@@ -8,4 +8,5 @@
'ring.middleware.file-info-test
'ring.middleware.static-test
'ring.middleware.reload-test
- 'ring.middleware.stacktrace-test)
+ 'ring.middleware.stacktrace-test
+ 'ring.middleware.params-test)

0 comments on commit f666802

Please sign in to comment.