forked from diamondap/clj-apache-http
-
Notifications
You must be signed in to change notification settings - Fork 0
/
async_libs.clj
72 lines (61 loc) · 2.51 KB
/
async_libs.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
;; The Apache HTTP Client libraries define several classes, including
;; Scheme and SchemeRegistry under two separate namespaces:
;; org.apache.http.conn and org.apache.http.nio.conn. The first is for
;; synchronous clients. The second is for async clients.
;;
;; Clojure complains when we try to include Scheme and SchemeRegistry
;; from both namespaces in the same Clojure namespace. For this reason,
;; the synchronous and async Apache classes are split into the
;; sync-libs and async-libs Clojure namespaces.
;;
;; API users should genarally not need to call into sync-libs and async-libs.
;; The x509 certificate manager and the async client are the main consumers
;; of these APIs.
(ns com.twinql.clojure.async-libs
(:import
(javax.net.ssl
SSLContext)
(org.apache.http.nio.reactor
IOSession)
(org.apache.http.conn.ssl
SSLSocketFactory)
(org.apache.http.nio.conn.ssl
SSLLayeringStrategy)
(org.apache.http.conn.ssl
SSLSocketFactory
X509HostnameVerifier
AllowAllHostnameVerifier)
(org.apache.http.nio.conn.scheme
Scheme
SchemeRegistry
LayeringStrategy)))
(defn ^SSLLayeringStrategy layering-strategy
"Returns a new LayeringStrategy for managing SSL connections."
[^SSLContext ssl-context ^X509HostnameVerifier hostname-verifier]
(let [verifier (or hostname-verifier (AllowAllHostnameVerifier.))]
(SSLLayeringStrategy. ssl-context verifier)))
(defn ^Scheme scheme
"Returns a new org.apache.http.nio.conn.scheme.Scheme. Param name should
be \"http\" or \"https\". Param port is the port to connect to on the
remote host."
[^String name ^long port ^LayeringStrategy strategy]
(Scheme. name port strategy))
(defn ^Scheme default-http-scheme []
(Scheme. "http" 80 nil))
(defn #^Scheme default-https-scheme []
(let [ctx (SSLContext/getInstance "SSL")]
(.init ctx nil nil nil)
(Scheme. "https" 443 (SSLLayeringStrategy. ctx))))
(defn ^SchemeRegistry default-scheme-registry []
(doto (SchemeRegistry.)
(. register (default-http-scheme))
(. register (default-https-scheme))))
(defn ^org.apache.http.nio.conn.scheme.SchemeRegistry scheme-registry
"Creates a scheme registry using the given socket factory to connect
on the port you specify. This scheme registry is suitable for the async
http client."
[^SSLSocketFactory socket-factory ^Long port
^SSLLayeringStrategy ssl-layering-strategy]
(let [^SchemeRegistry scheme-registry (SchemeRegistry.)]
(.register scheme-registry (Scheme. "https" port ssl-layering-strategy))
scheme-registry))