@@ -18,12 +18,17 @@ import Pipes
1818import qualified Pipes.ByteString as PB
1919import qualified Pipes.HTTP as PH
2020import Text.Printf (printf)
21+import Network.HTTP.Client.OpenSSL
22+import OpenSSL (withOpenSSL)
23+import OpenSSL.Session (SSLContext, context)
24+import qualified OpenSSL.Session as SSL
2125
2226
2327defaultClientOpts :: DockerClientOpts
2428defaultClientOpts = DockerClientOpts
2529 { apiVersion = "v1.12"
2630 , baseUrl = "http://127.0.0.1:3128/"
31+ , ssl = NoSSL
2732 }
2833
2934constructUrl :: URL -> ApiVersion -> Endpoint -> URL
@@ -40,11 +45,43 @@ getResponseStatusCode r = (^. responseStatus) r
4045fullUrl :: DockerClientOpts -> Endpoint -> URL
4146fullUrl clientOpts endpoint = constructUrl (baseUrl clientOpts) (apiVersion clientOpts) endpoint
4247
48+setupSSLCtx :: SSLOptions -> IO SSLContext
49+setupSSLCtx (SSLOptions key cert) = do
50+ ctx <- SSL.context
51+ SSL.contextSetPrivateKeyFile ctx key
52+ SSL.contextSetCertificateFile ctx cert
53+ SSL.contextAddOption ctx SSL.SSL_OP_NO_SSLv3
54+ SSL.contextAddOption ctx SSL.SSL_OP_NO_SSLv2
55+ return ctx
56+
57+
58+mkOpts c = defaults & manager .~ Left (opensslManagerSettings c)
59+
60+getSSL
61+ :: SSLOptions
62+ -> String
63+ -> IO (Response L.ByteString)
64+getSSL sopts url = withOpenSSL $ getWith (mkOpts $ setupSSLCtx sopts) url
65+
66+postSSL
67+ :: ToJSON a
68+ => SSLOptions
69+ -> String
70+ -> a
71+ -> IO (Response L.ByteString)
72+postSSL sopts url = withOpenSSL . postWith (mkOpts $ setupSSLCtx sopts) url . toJSON
73+
4374_dockerGetQuery :: Endpoint -> DockerClientOpts -> IO(Response L.ByteString)
44−_dockerGetQuery endpoint clientOpts = get (fullUrl clientOpts endpoint)
75+_dockerGetQuery endpoint clientOpts@DockerClientOpts{ssl = NoSSL} =
76+ get (fullUrl clientOpts endpoint)
77+_dockerGetQuery endpoint clientOpts@DockerClientOpts{ssl = SSL sslOpts} =
78+ getSSL sslOpts (fullUrl clientOpts endpoint)
4579
4680_dockerPostQuery :: ToJSON a => Endpoint -> DockerClientOpts -> a -> IO (Response L.ByteString)
47−_dockerPostQuery endpoint clientOpts postObject = post (fullUrl clientOpts endpoint) (toJSON postObject)
81+_dockerPostQuery endpoint clientOpts@DockerClientOpts{ssl = NoSSL} postObject =
82+ post (fullUrl clientOpts endpoint) (toJSON postObject)
83+_dockerPostQuery endpoint clientOpts@DockerClientOpts{ssl = SSL sslOpts} postObject =
84+ postSSL sslOpts (fullUrl clientOpts endpoint) postObject
4885
4986emptyPost = "" :: String
5087_dockerEmptyPostQuery endpoint clientOpts = post (fullUrl clientOpts endpoint) (toJSON emptyPost)