|  | 
| 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