Skip to content

Commit 64546e6

Browse files
committed
Merge branch 'pr/235'
2 parents 75b82f1 + 4044f85 commit 64546e6

File tree

3 files changed

+51
-18
lines changed

3 files changed

+51
-18
lines changed

src/clj_http/client.clj

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,22 @@
5959
(apply (ns-resolve (symbol "crouton.html") (symbol "parse")) args))
6060

6161
(defn ^:dynamic parse-transit
62-
"Resolve and apply Transit's JSON/MessagePack parsing."
63-
[& args]
62+
"Resolve and apply Transit's JSON/MessagePack decoding."
63+
[in type & [opts]]
6464
{:pre [transit-enabled?]}
6565
(let [reader (ns-resolve 'cognitect.transit 'reader)
6666
read (ns-resolve 'cognitect.transit 'read)]
67-
(read (apply reader args))))
67+
(read (reader in type opts))))
68+
69+
(defn ^:dynamic transit-encode
70+
"Resolve and apply Transit's JSON/MessagePack encoding."
71+
[out type & [opts]]
72+
{:pre [transit-enabled?]}
73+
(let [output (java.io.ByteArrayOutputStream.)
74+
writer (ns-resolve 'cognitect.transit 'writer)
75+
write (ns-resolve 'cognitect.transit 'write)]
76+
(write (writer output type opts) out)
77+
(.toByteArray output)))
6878

6979
(defn ^:dynamic json-encode
7080
"Resolve and apply cheshire's json encoding dynamically."
@@ -642,13 +652,7 @@
642652
:form-params form-params
643653
:transit-opts transit-opts
644654
:transit-type type})))
645-
(let [output (java.io.ByteArrayOutputStream.)
646-
writer (ns-resolve 'cognitect.transit 'writer)
647-
write (ns-resolve 'cognitect.transit 'write)
648-
_ (write (writer output type transit-opts) form-params)
649-
bytes (.toByteArray output)]
650-
(.reset output)
651-
bytes))
655+
(transit-encode form-params type transit-opts))
652656

653657
(defmethod coerce-form-params :application/transit+json [req]
654658
(coerce-transit-form-params :json req))
@@ -701,13 +705,15 @@
701705
(defn wrap-nested-params
702706
"Middleware wrapping nested parameters for query strings."
703707
[client]
704-
(fn [{:keys [query-params form-params content-type] :as req}]
705-
(if (= :json content-type)
706-
(client req)
708+
(fn [{:keys [query-params form-params content-type]
709+
:as req}]
710+
(if (or (nil? content-type)
711+
(= content-type :x-www-form-urlencoded))
707712
(client (reduce
708713
nest-params
709714
req
710-
[:query-params :form-params])))))
715+
[:query-params :form-params]))
716+
(client req))))
711717

712718
(defn wrap-url
713719
"Middleware wrapping request URL parsing."

test/clj_http/test/client.clj

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44
[clj-http.conn-mgr :as conn]
55
[clj-http.test.core :refer [run-server]]
66
[clj-http.util :as util]
7+
[clojure.string :as str]
78
[clojure.java.io :refer [resource]]
8-
[clojure.test :refer :all])
9+
[clojure.test :refer :all]
10+
[ring.util.codec :refer [form-decode-str]]
11+
[ring.middleware.nested-params :refer [parse-nested-keys]])
912
(:import (java.net UnknownHostException)
1013
(java.util Arrays)
1114
(java.io ByteArrayInputStream)
@@ -19,6 +22,15 @@
1922
(defn request [req]
2023
(client/request (merge base-req req)))
2124

25+
(defn parse-form-params [s]
26+
(->> (str/split (form-decode-str s) #"&")
27+
(map #(str/split % #"="))
28+
(map #(vector
29+
(map keyword (parse-nested-keys (first %)))
30+
(second %)))
31+
(reduce (fn [m [ks v]]
32+
(assoc-in m ks v)) {})))
33+
2234
(deftest ^:integration roundtrip
2335
(run-server)
2436
;; roundtrip with scheme as a keyword
@@ -31,7 +43,22 @@
3143
:scheme "http"})]
3244
(is (= 200 (:status resp)))
3345
(is (= "close" (get-in resp [:headers "connection"])))
34-
(is (= "get" (:body resp)))))
46+
(is (= "get" (:body resp))))
47+
(let [params {:a "1" :b {:c "2"}}]
48+
(doseq [[content-type read-fn]
49+
[[nil (comp parse-form-params slurp)]
50+
[:x-www-form-urlencoded (comp parse-form-params slurp)]
51+
[:edn (comp read-string slurp)]
52+
[:transit+json #(client/parse-transit % :json)]
53+
[:transit+msgpack #(client/parse-transit % :msgpack)]]]
54+
(let [resp (request {:uri "/post"
55+
:as :stream
56+
:method :post
57+
:content-type content-type
58+
:form-params params})]
59+
(is (= 200 (:status resp)))
60+
(is (= "close" (get-in resp [:headers "connection"])))
61+
(is (= params (read-fn (:body resp))))))))
3562

3663
(deftest ^:integration nil-input
3764
(is (thrown-with-msg? Exception #"Host URL cannot be nil"

test/clj_http/test/core.clj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373
[:get "/header"]
7474
{:status 200 :body (get-in req [:headers "x-my-header"])}
7575
[:post "/post"]
76-
{:status 200 :body (slurp (:body req))}
76+
{:status 200 :body (:body req)}
7777
[:get "/error"]
7878
{:status 500 :body "o noes"}
7979
[:get "/timeout"]
@@ -100,7 +100,7 @@
100100
(defn run-server
101101
[]
102102
(defonce server
103-
(ring/run-jetty handler {:port 18080 :join? false})))
103+
(ring/run-jetty #'handler {:port 18080 :join? false})))
104104

105105
(defn localhost [path]
106106
(str "http://localhost:18080" path))

0 commit comments

Comments
 (0)