|
6 | 6 | (java.security KeyStore) |
7 | 7 | (java.security.cert X509Certificate) |
8 | 8 | (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) |
12 | 10 | (org.apache.http.conn HttpClientConnectionManager) |
13 | | - (org.apache.http.conn.ssl SSLSocketFactory TrustStrategy |
14 | | - X509HostnameVerifier SSLContexts) |
| 11 | + (org.apache.http.conn.ssl SSLSocketFactory) |
15 | 12 | (org.apache.http.conn.scheme PlainSocketFactory |
16 | 13 | SchemeRegistry Scheme) |
17 | | - (org.apache.http.conn.ssl BrowserCompatHostnameVerifier |
18 | | - SSLConnectionSocketFactory SSLContexts) |
19 | 14 | (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) |
24 | 16 | (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)) |
56 | 35 |
|
57 | 36 | ;; New Generic Socket Factories that can support socks proxy |
58 | 37 | (defn ^SSLSocketFactory SSLGenericSocketFactory |
|
91 | 70 | (PoolingClientConnectionManager. reg))) |
92 | 71 |
|
93 | 72 | (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))) |
97 | 77 |
|
98 | 78 | (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))) |
102 | 83 |
|
103 | 84 | (defn ^KeyStore get-keystore* |
104 | 85 | [keystore-file keystore-type ^String keystore-pass] |
|
114 | 95 | keystore |
115 | 96 | (apply get-keystore* keystore args))) |
116 | 97 |
|
117 | | -(defn ^SchemeRegistry get-keystore-scheme-registry |
| 98 | +(defn ^Registry get-keystore-scheme-registry |
118 | 99 | [{:keys [keystore keystore-type keystore-pass keystore-instance |
119 | 100 | trust-store trust-store-type trust-store-pass] |
120 | 101 | :as req}] |
121 | 102 | (let [ks (get-keystore keystore keystore-type keystore-pass) |
122 | 103 | 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 |
131 | 121 | [{:keys [keystore trust-store] :as req}] |
132 | 122 | (cond |
133 | 123 | (or keystore trust-store) |
134 | | - (BasicClientConnectionManager. (get-keystore-scheme-registry req)) |
| 124 | + (BasicHttpClientConnectionManager. (get-keystore-scheme-registry req)) |
135 | 125 |
|
136 | | - (opt req :insecure) (BasicClientConnectionManager. insecure-scheme-registry) |
| 126 | + (opt req :insecure) (BasicHttpClientConnectionManager. |
| 127 | + insecure-scheme-registry) |
137 | 128 |
|
138 | | - :else (BasicClientConnectionManager. regular-scheme-registry))) |
| 129 | + :else (BasicHttpClientConnectionManager. regular-scheme-registry))) |
139 | 130 |
|
140 | 131 | ;; need the fully qualified class name because this fn is later used in a |
141 | 132 | ;; macro from a different ns |
142 | | -(defn ^org.apache.http.impl.conn.PoolingClientConnectionManager |
| 133 | +(defn ^org.apache.http.impl.conn.PoolingHttpClientConnectionManager |
143 | 134 | make-reusable-conn-manager* |
144 | 135 | "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 |
146 | 137 | timeout value." |
147 | 138 | [{:keys [timeout keystore trust-store] :as config}] |
148 | 139 | (let [registry (cond |
|
152 | 143 | (get-keystore-scheme-registry config) |
153 | 144 |
|
154 | 145 | :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))) |
159 | 147 |
|
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)) |
163 | 150 |
|
164 | | -(defn ^PoolingClientConnectionManager make-reusable-conn-manager |
| 151 | +(defn ^PoolingHttpClientConnectionManager make-reusable-conn-manager |
165 | 152 | "Creates a default pooling connection manager with the specified options. |
166 | 153 |
|
167 | 154 | The following options are supported: |
|
187 | 174 | [opts] |
188 | 175 | (let [timeout (or (:timeout opts) 5) |
189 | 176 | threads (or (:threads opts) 4) |
190 | | - default-per-route (or (:default-per-route opts) dmcpr) |
| 177 | + default-per-route (:default-per-route opts) |
191 | 178 | 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)) |
231 | 187 |
|
232 | 188 | (defn shutdown-manager |
233 | 189 | "Shut down the given connection manager, if it is not nil" |
234 | | - [^ClientConnectionManager manager] |
| 190 | + [^HttpClientConnectionManager manager] |
235 | 191 | (and manager (.shutdown manager))) |
236 | 192 |
|
237 | 193 | (def ^:dynamic *connection-manager* |
|
0 commit comments