|
4 | 4 | [clojure.string :as string]
|
5 | 5 | [ring.util.codec :as codec]
|
6 | 6 | [ring.util.mime-type :as mime])
|
7 |
| - (:import [java.io ByteArrayInputStream ByteArrayOutputStream File] |
| 7 | + (:import [java.io ByteArrayInputStream ByteArrayOutputStream File InputStream] |
| 8 | + [java.net URI] |
8 | 9 | [java.nio.charset Charset]
|
| 10 | + [java.util Map] |
9 | 11 | [org.apache.hc.core5.http ContentType HttpEntity]
|
10 | 12 | [org.apache.hc.client5.http.entity.mime MultipartEntityBuilder]))
|
11 | 13 |
|
|
75 | 77 | (defmethod body (class (byte-array 0)) [request bytes]
|
76 | 78 | (-> request
|
77 | 79 | (content-length (count bytes))
|
78 |
| - (assoc :body (java.io.ByteArrayInputStream. bytes)))) |
| 80 | + (assoc :body (ByteArrayInputStream. bytes)))) |
79 | 81 |
|
80 |
| -(defmethod body java.util.Map [request params] |
| 82 | +(defmethod body Map [request params] |
81 | 83 | (-> request
|
82 | 84 | (content-type "application/x-www-form-urlencoded")
|
83 | 85 | (body (encode-params params))))
|
|
99 | 101 | (defn- file? [f]
|
100 | 102 | (instance? File f))
|
101 | 103 |
|
102 |
| -(defn- add-multipart-part [builder k v] |
| 104 | +(defn- str->bytes ^bytes [^String s] |
| 105 | + (.getBytes s ^Charset default-charset)) |
| 106 | + |
| 107 | +(defn- add-binary-body |
| 108 | + [^MultipartEntityBuilder builder key value ^ContentType mimetype |
| 109 | + ^String filename] |
| 110 | + (let [k (name key)] |
| 111 | + (cond |
| 112 | + (string? value) |
| 113 | + (.addBinaryBody builder k (str->bytes value) mimetype filename) |
| 114 | + (bytes? value) |
| 115 | + (.addBinaryBody builder k ^bytes value mimetype filename) |
| 116 | + (file? value) |
| 117 | + (.addBinaryBody builder k ^File value mimetype filename) |
| 118 | + (instance? InputStream value) |
| 119 | + (.addBinaryBody builder k ^InputStream value mimetype filename) |
| 120 | + :else |
| 121 | + (throw (IllegalArgumentException. |
| 122 | + (str "Cannot encode a value of type " (type value) |
| 123 | + " as a multipart body.")))))) |
| 124 | + |
| 125 | +(defn- add-multipart-part [^MultipartEntityBuilder builder k v] |
103 | 126 | (let [param (if (map? v) v {:value v})
|
104 |
| - value (if (string? (:value param)) |
105 |
| - (.getBytes (:value param) default-charset) |
106 |
| - (:value param)) |
| 127 | + value (if (map? v) (:value v) v) |
107 | 128 | mimetype (ContentType/parse
|
108 | 129 | (or (:content-type param)
|
109 | 130 | (when (file? value)
|
|
113 | 134 | "application/octet-stream")))
|
114 | 135 | filename (or (:filename param)
|
115 | 136 | (when (file? value) (.getName ^File value)))]
|
116 |
| - (.addBinaryBody builder (name k) value mimetype filename))) |
| 137 | + (add-binary-body builder (name k) value mimetype filename))) |
117 | 138 |
|
118 | 139 | (defn- multipart-entity ^HttpEntity [params]
|
119 | 140 | (let [builder (MultipartEntityBuilder/create)]
|
120 |
| - (.setCharset builder default-charset) |
| 141 | + (.setCharset builder ^Charset default-charset) |
121 | 142 | (doseq [[k v] params]
|
122 | 143 | (add-multipart-part builder k v))
|
123 | 144 | (.build builder)))
|
|
157 | 178 | ([method uri]
|
158 | 179 | (request method uri nil))
|
159 | 180 | ([method uri params]
|
160 |
| - (let [uri (java.net.URI. uri) |
| 181 | + (let [uri (URI. uri) |
161 | 182 | scheme (keyword (or (.getScheme uri) "http"))
|
162 | 183 | host (or (.getHost uri) "localhost")
|
163 | 184 | port (when (not= (.getPort uri) -1) (.getPort uri))
|
|
0 commit comments