Skip to content

Commit 0cc598f

Browse files
committed
Merge branch 'pr/303'
2 parents e1ad108 + 6965efb commit 0cc598f

File tree

6 files changed

+201
-161
lines changed

6 files changed

+201
-161
lines changed

src/clj_http/client.clj

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
(java.net URL UnknownHostException)
1515
(org.apache.http.entity BufferedHttpEntity ByteArrayEntity
1616
InputStreamEntity FileEntity StringEntity)
17-
(org.apache.http.impl.conn PoolingClientConnectionManager))
17+
(org.apache.http.impl.conn PoolingHttpClientConnectionManager))
1818
(:refer-clojure :exclude [get update]))
1919

2020
;; Cheshire is an optional dependency, so we check for it at compile time.
@@ -953,9 +953,9 @@
953953

954954
(defmacro with-connection-pool
955955
"Macro to execute the body using a connection manager. Creates a
956-
PoolingClientConnectionManager to use for all requests within the body of
957-
the expression. An option map is allowed to set options for the connection
958-
manager.
956+
PoolingHttpClientConnectionManager to use for all requests within the
957+
body of the expression. An option map is allowed to set options for the
958+
connection manager.
959959
960960
The following options are supported:
961961
@@ -989,5 +989,5 @@
989989
~@body
990990
(finally
991991
(.shutdown
992-
^PoolingClientConnectionManager
992+
^PoolingHttpClientConnectionManager
993993
conn/*connection-manager*))))))

src/clj_http/conn_mgr.clj

Lines changed: 67 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -6,53 +6,32 @@
66
(java.security KeyStore)
77
(java.security.cert X509Certificate)
88
(javax.net.ssl SSLSession SSLSocket)
9-
(org.apache.http.config RegistryBuilder)
10-
(org.apache.http.conn ClientConnectionManager)
11-
(org.apache.http.conn.params ConnPerRouteBean)
9+
(org.apache.http.config RegistryBuilder Registry)
1210
(org.apache.http.conn HttpClientConnectionManager)
13-
(org.apache.http.conn.ssl SSLSocketFactory TrustStrategy
14-
X509HostnameVerifier SSLContexts)
11+
(org.apache.http.conn.ssl SSLSocketFactory)
1512
(org.apache.http.conn.scheme PlainSocketFactory
1613
SchemeRegistry Scheme)
17-
(org.apache.http.conn.ssl BrowserCompatHostnameVerifier
18-
SSLConnectionSocketFactory SSLContexts)
1914
(org.apache.http.conn.socket PlainConnectionSocketFactory)
20-
(org.apache.http.impl.conn BasicClientConnectionManager
21-
PoolingClientConnectionManager
22-
SchemeRegistryFactory
23-
SingleClientConnManager)
15+
(org.apache.http.impl.conn PoolingClientConnectionManager)
2416
(org.apache.http.impl.conn BasicHttpClientConnectionManager
25-
PoolingHttpClientConnectionManager)))
26-
27-
(def ^SSLSocketFactory insecure-socket-factory
28-
(SSLSocketFactory. (reify TrustStrategy
29-
(isTrusted [_ _ _] true))
30-
(reify X509HostnameVerifier
31-
(^void verify [this ^String host ^SSLSocket sock]
32-
;; for some strange reason, only TLSv1 really
33-
;; works here, if you know why, tell me.
34-
(.setEnabledProtocols
35-
sock (into-array String ["TLSv1"]))
36-
(.setWantClientAuth sock false)
37-
(let [session (.getSession sock)]
38-
(when-not session
39-
(.startHandshake sock))
40-
(aget (.getPeerCertificates session) 0)
41-
;; normally you'd want to verify the cert
42-
;; here, but since this is an insecure
43-
;; socketfactory, we don't
44-
nil))
45-
(^void verify [_ ^String _ ^X509Certificate _]
46-
nil)
47-
(^void verify [_ ^String _ ^"[Ljava.lang.String;" _
48-
^"[Ljava.lang.String;" _]
49-
nil)
50-
(^boolean verify [_ ^String _ ^SSLSession _]
51-
true))))
52-
53-
(def ^SSLSocketFactory secure-ssl-socket-factory
54-
(doto (SSLSocketFactory/getSocketFactory)
55-
(.setHostnameVerifier SSLSocketFactory/STRICT_HOSTNAME_VERIFIER)))
17+
PoolingHttpClientConnectionManager)
18+
(org.apache.http.conn.ssl SSLConnectionSocketFactory
19+
DefaultHostnameVerifier
20+
NoopHostnameVerifier
21+
TrustStrategy)
22+
(org.apache.http.ssl SSLContexts)
23+
(org.apache.http.pool ConnPoolControl)))
24+
25+
(def ^SSLConnectionSocketFactory insecure-socket-factory
26+
(SSLConnectionSocketFactory.
27+
(-> (SSLContexts/custom)
28+
(.loadTrustMaterial nil (reify TrustStrategy
29+
(isTrusted [_ _ _] true)))
30+
(.build))
31+
NoopHostnameVerifier/INSTANCE))
32+
33+
(def ^SSLConnectionSocketFactory secure-ssl-socket-factory
34+
(SSLConnectionSocketFactory/getSocketFactory))
5635

5736
;; New Generic Socket Factories that can support socks proxy
5837
(defn ^SSLSocketFactory SSLGenericSocketFactory
@@ -91,14 +70,16 @@
9170
(PoolingClientConnectionManager. reg)))
9271

9372
(def insecure-scheme-registry
94-
(doto (SchemeRegistry.)
95-
(.register (Scheme. "http" 80 (PlainSocketFactory/getSocketFactory)))
96-
(.register (Scheme. "https" 443 insecure-socket-factory))))
73+
(-> (RegistryBuilder/create)
74+
(.register "http" PlainConnectionSocketFactory/INSTANCE)
75+
(.register "https" insecure-socket-factory)
76+
(.build)))
9777

9878
(def regular-scheme-registry
99-
(doto (SchemeRegistry.)
100-
(.register (Scheme. "http" 80 (PlainSocketFactory/getSocketFactory)))
101-
(.register (Scheme. "https" 443 secure-ssl-socket-factory))))
79+
(-> (RegistryBuilder/create)
80+
(.register "http" (PlainConnectionSocketFactory/getSocketFactory))
81+
(.register "https" secure-ssl-socket-factory)
82+
(.build)))
10283

10384
(defn ^KeyStore get-keystore*
10485
[keystore-file keystore-type ^String keystore-pass]
@@ -114,35 +95,45 @@
11495
keystore
11596
(apply get-keystore* keystore args)))
11697

117-
(defn ^SchemeRegistry get-keystore-scheme-registry
98+
(defn ^Registry get-keystore-scheme-registry
11899
[{:keys [keystore keystore-type keystore-pass keystore-instance
119100
trust-store trust-store-type trust-store-pass]
120101
:as req}]
121102
(let [ks (get-keystore keystore keystore-type keystore-pass)
122103
ts (get-keystore trust-store trust-store-type trust-store-pass)
123-
factory (SSLSocketFactory. ks keystore-pass ts)]
124-
(if (opt req :insecure)
125-
(.setHostnameVerifier factory
126-
SSLSocketFactory/ALLOW_ALL_HOSTNAME_VERIFIER))
127-
(doto (SchemeRegistryFactory/createDefault)
128-
(.register (Scheme. "https" 443 factory)))))
129-
130-
(defn ^BasicClientConnectionManager make-regular-conn-manager
104+
ssl-context (-> (SSLContexts/custom)
105+
(.loadKeyMaterial
106+
ks (when keystore-pass
107+
(.toCharArray keystore-pass)))
108+
(.loadTrustMaterial
109+
ts nil)
110+
(.build))
111+
hostname-verifier (if (opt req :insecure)
112+
NoopHostnameVerifier/INSTANCE
113+
(DefaultHostnameVerifier.))
114+
factory (SSLConnectionSocketFactory.
115+
ssl-context hostname-verifier )]
116+
(-> (RegistryBuilder/create)
117+
(.register "https" factory)
118+
(.build))))
119+
120+
(defn ^BasicHttpClientConnectionManager make-regular-conn-manager
131121
[{:keys [keystore trust-store] :as req}]
132122
(cond
133123
(or keystore trust-store)
134-
(BasicClientConnectionManager. (get-keystore-scheme-registry req))
124+
(BasicHttpClientConnectionManager. (get-keystore-scheme-registry req))
135125

136-
(opt req :insecure) (BasicClientConnectionManager. insecure-scheme-registry)
126+
(opt req :insecure) (BasicHttpClientConnectionManager.
127+
insecure-scheme-registry)
137128

138-
:else (BasicClientConnectionManager. regular-scheme-registry)))
129+
:else (BasicHttpClientConnectionManager. regular-scheme-registry)))
139130

140131
;; need the fully qualified class name because this fn is later used in a
141132
;; macro from a different ns
142-
(defn ^org.apache.http.impl.conn.PoolingClientConnectionManager
133+
(defn ^org.apache.http.impl.conn.PoolingHttpClientConnectionManager
143134
make-reusable-conn-manager*
144135
"Given an timeout and optional insecure? flag, create a
145-
PoolingClientConnectionManager with <timeout> seconds set as the
136+
PoolingHttpClientConnectionManager with <timeout> seconds set as the
146137
timeout value."
147138
[{:keys [timeout keystore trust-store] :as config}]
148139
(let [registry (cond
@@ -152,16 +143,12 @@
152143
(get-keystore-scheme-registry config)
153144

154145
:else regular-scheme-registry)]
155-
(PoolingClientConnectionManager.
156-
registry timeout java.util.concurrent.TimeUnit/SECONDS)))
157-
158-
(def dmcpr ConnPerRouteBean/DEFAULT_MAX_CONNECTIONS_PER_ROUTE)
146+
(PoolingHttpClientConnectionManager. registry)))
159147

160-
(defn reusable? [^ClientConnectionManager conn-mgr]
161-
(not (or (instance? SingleClientConnManager conn-mgr)
162-
(instance? BasicClientConnectionManager conn-mgr))))
148+
(defn reusable? [^HttpClientConnectionManager conn-mgr]
149+
(instance? PoolingHttpClientConnectionManager conn-mgr))
163150

164-
(defn ^PoolingClientConnectionManager make-reusable-conn-manager
151+
(defn ^PoolingHttpClientConnectionManager make-reusable-conn-manager
165152
"Creates a default pooling connection manager with the specified options.
166153
167154
The following options are supported:
@@ -187,51 +174,20 @@
187174
[opts]
188175
(let [timeout (or (:timeout opts) 5)
189176
threads (or (:threads opts) 4)
190-
default-per-route (or (:default-per-route opts) dmcpr)
177+
default-per-route (:default-per-route opts)
191178
insecure? (opt opts :insecure)
192-
leftovers (dissoc opts :timeout :threads :insecure? :insecure)]
193-
(doto (make-reusable-conn-manager* (merge {:timeout timeout
194-
:insecure? insecure?}
195-
leftovers))
196-
(.setMaxTotal threads)
197-
(.setDefaultMaxPerRoute default-per-route))))
198-
199-
(defn ^javax.net.ssl.SSLContext ssl-context []
200-
(SSLContexts/createSystemDefault))
201-
202-
(defn ^javax.net.ssl.HostnameVerifier hostname-verifier []
203-
(BrowserCompatHostnameVerifier.))
204-
205-
(defn ^org.apache.http.config.Registry insecure-registry-builder []
206-
(-> (RegistryBuilder/create)
207-
(.register "http" PlainConnectionSocketFactory/INSTANCE)
208-
(.register "https" insecure-socket-factory)
209-
(.build)))
210-
211-
(defn ^org.apache.http.config.Registry registry-builder [{:keys [insecure?] :as opts}]
212-
(-> (RegistryBuilder/create)
213-
(.register "http" PlainConnectionSocketFactory/INSTANCE)
214-
(.register "https"
215-
(cond
216-
insecure? insecure-socket-factory
217-
:default
218-
(SSLConnectionSocketFactory.
219-
(ssl-context)
220-
(hostname-verifier))))
221-
(.build)))
222-
223-
(defn pooling-conn-mgr []
224-
(PoolingHttpClientConnectionManager. (registry-builder {})))
225-
226-
(defn basic-conn-mgr []
227-
(BasicHttpClientConnectionManager. (registry-builder {})))
228-
229-
(defn reusable? [^HttpClientConnectionManager conn-mgr]
230-
(instance? PoolingHttpClientConnectionManager conn-mgr))
179+
leftovers (dissoc opts :timeout :threads :insecure? :insecure)
180+
conn-man (make-reusable-conn-manager* (merge {:timeout timeout
181+
:insecure? insecure?}
182+
leftovers))]
183+
(.setMaxTotal conn-man threads)
184+
(when default-per-route
185+
(.setDefaultMaxPerRoute conn-man default-per-route))
186+
conn-man))
231187

232188
(defn shutdown-manager
233189
"Shut down the given connection manager, if it is not nil"
234-
[^ClientConnectionManager manager]
190+
[^HttpClientConnectionManager manager]
235191
(and manager (.shutdown manager)))
236192

237193
(def ^:dynamic *connection-manager*

0 commit comments

Comments
 (0)