Skip to content

Instantly share code, notes, and snippets.

@jjl
Created December 4, 2013 10:32
Show Gist options
  • Save jjl/7785497 to your computer and use it in GitHub Desktop.
Save jjl/7785497 to your computer and use it in GitHub Desktop.
Ring middleware
(defn wrap-http-params [handler]
(fn [request]
(let [query-params (request :query-params)
form-params (request :form-params)]
(let [http-params (merge {} query-params form-params)]
(handler (assoc request :http-params http-params))))))
(defn wrap-keyword-http-params [handler]
(fn [request]
(letfn [(kwify [req kw]
(let [item (req kw)]
(if item
(assoc req kw (rmap/keywordify item))
req)))]
(handler (reduce kwify request '(:query-params :form-params))))))
(defn sk [i]
(sort (keys i)))
(defn wrap [i]
(wrap-keyword-http-params i))
(defn id [a] a)
(defn wrapped [a] ((wrap id) a))
(defn skw [a] (sk (wrapped a)))
(defn thrower [a] (throw (Exception. "An Exception")))
(deftest test-middleware-kw-h-p
(let [basic {"a" 1 "b" 2}
basic2 {"c" 3 "d" 4}
kw1 '(:a :b)
kw2 '(:c :d)]
(let [sample1 {}
sample2 {:query-params {}}
sample3 {:form-params {}}
sample4 {:query-params basic}
sample5 {:query-params basic :form-params {}}
sample6 {:query-params {} :form-params basic}
sample7 {:form-params basic}
sample8 {:query-params basic :form-params basic2}
sample9 {:query-params {} :form-params {}}
kb (sk basic)
kb2 (sk basic2)]
(testing "keys unmodified"
(is (= (skw sample1)
'()))
(is (= (skw sample2)
(skw sample4)
'(:query-params)))
(is (= (skw sample3)
(skw sample7)
'(:form-params)))
(is (= (skw sample5)
(skw sample6)
(skw sample8)
(skw sample9)
'(:form-params :query-params))))
(testing "empties"
(is (= (keys ((wrapped sample2) :query-params))
(keys ((wrapped sample3) :form-params))
(keys ((wrapped sample5) :form-params))
(keys ((wrapped sample6) :query-params))
(keys ((wrapped sample9) :query-params))
(keys ((wrapped sample9) :form-params))
nil)))
(testing "nonempties"
(is (= (sk ((wrapped sample4) :query-params))
(sk ((wrapped sample5) :query-params))
(sk ((wrapped sample8) :query-params))
(sk ((wrapped sample6) :form-params))
(sk ((wrapped sample7) :form-params))
kw1))
(is (=
(sk ((wrapped sample8) :form-params))
kw2)))
(testing "pass through"
(is (thrown? Exception ((wrapped thrower))))))))
(defn sk [i]
(sort (keys i)))
(defn wrap [i]
(wrap-http-params i))
(defn id [a] a)
(defn wrapped [a] ((wrap id) a))
(defn skw [a] (sk (wrapped a)))
(defn thrower [a] (throw (Exception. "An Exception")))
(deftest test-middleware-http-params
(let [basic {:a 1 :b 2}
basic2 {:c 3 :d 4}
basic3 {:a 1 :b 2 :c 3 :d 4}]
(let [sample1 {}
sample2 {:query-params {}}
sample3 {:form-params {}}
sample4 {:query-params basic}
sample5 {:query-params basic :form-params {}}
sample6 {:query-params {} :form-params basic}
sample7 {:form-params basic}
sample8 {:query-params basic :form-params basic2}
sample9 {:query-params {} :form-params {}}
kw1 (sk basic)
kw2 (sk basic2)
kw3 (sk basic3)]
(testing "key added"
(is (= (skw sample1)
'(:http-params)))
(is (= (skw sample2)
(skw sample4)
'(:http-params :query-params)))
(is (= (skw sample3)
(skw sample7)
'(:form-params :http-params)))
(is (= (skw sample5)
(skw sample6)
(skw sample8)
(skw sample9)
'(:form-params :http-params :query-params))))
(testing "results"
(is (= (keys ((wrapped sample2) :http-params))
(keys ((wrapped sample3) :http-params))
nil))
(is (= (sk ((wrapped sample4) :http-params))
(sk ((wrapped sample5) :http-params))
(sk ((wrapped sample6) :http-params))
(sk ((wrapped sample7) :http-params))
kw1))
(is (= (sk ((wrapped sample8) :http-params))
kw3)))
(testing "sources untouched"
(is (= (keys ((wrapped sample2) :query-params))
(keys ((wrapped sample3) :form-params))
(keys ((wrapped sample5) :form-params))
(keys ((wrapped sample6) :query-params))
(keys ((wrapped sample9) :query-params))
(keys ((wrapped sample9) :form-params))
nil))
(is (= (sk ((wrapped sample4) :query-params))
(sk ((wrapped sample5) :query-params))
(sk ((wrapped sample8) :query-params))
(sk ((wrapped sample6) :form-params))
(sk ((wrapped sample7) :form-params))
kw1))
(is (= (sk ((wrapped sample8) :form-params))
kw2)))
(testing "pass through"
(is (thrown? Exception ((wrapped thrower))))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment