@@ -18,12 +18,17 @@ import Pipes
18import qualified Pipes.ByteString as PB
18import qualified Pipes.ByteString as PB
19import qualified Pipes.HTTP as PH
19import qualified Pipes.HTTP as PH
20import Text.Printf (printf)
20import 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
23defaultClientOpts :: DockerClientOpts
27defaultClientOpts :: DockerClientOpts
24defaultClientOpts = DockerClientOpts
28defaultClientOpts = DockerClientOpts
25 { apiVersion = "v1.12"
29 { apiVersion = "v1.12"
26 , baseUrl = "http://127.0.0.1:3128/"
30 , baseUrl = "http://127.0.0.1:3128/"
29constructUrl :: URL -> ApiVersion -> Endpoint -> URL
34constructUrl :: URL -> ApiVersion -> Endpoint -> URL
@@ -40,11 +45,43 @@ getResponseStatusCode r = (^. responseStatus) r
40fullUrl :: DockerClientOpts -> Endpoint -> URL
45fullUrl :: DockerClientOpts -> Endpoint -> URL
41fullUrl clientOpts endpoint = constructUrl (baseUrl clientOpts) (apiVersion clientOpts) endpoint
46fullUrl clientOpts endpoint = constructUrl (baseUrl clientOpts) (apiVersion clientOpts) endpoint
48+setupSSLCtx :: SSLOptions -> IO SSLContext
49+setupSSLCtx (SSLOptions key cert) = do
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
58+mkOpts c = defaults & manager .~ Left (opensslManagerSettings c)
63+ -> IO (Response L.ByteString)
64+getSSL sopts url = withOpenSSL $ getWith (mkOpts $ setupSSLCtx sopts) url
71+ -> IO (Response L.ByteString)
72+postSSL sopts url = withOpenSSL . postWith (mkOpts $ setupSSLCtx sopts) url . toJSON
43_dockerGetQuery :: Endpoint -> DockerClientOpts -> IO(Response L.ByteString)
74_dockerGetQuery :: Endpoint -> DockerClientOpts -> IO(Response L.ByteString)
75+_dockerGetQuery endpoint clientOpts@DockerClientOpts{ssl = NoSSL} =
44−_dockerGetQuery endpoint clientOpts = get (fullUrl clientOpts endpoint)
76+ get (fullUrl clientOpts endpoint)
77+_dockerGetQuery endpoint clientOpts@DockerClientOpts{ssl = SSL sslOpts} =
78+ getSSL sslOpts (fullUrl clientOpts endpoint)
46_dockerPostQuery :: ToJSON a => Endpoint -> DockerClientOpts -> a -> IO (Response L.ByteString)
80_dockerPostQuery :: ToJSON a => Endpoint -> DockerClientOpts -> a -> IO (Response L.ByteString)
81+_dockerPostQuery endpoint clientOpts@DockerClientOpts{ssl = NoSSL} postObject =
47−_dockerPostQuery endpoint clientOpts postObject = post (fullUrl clientOpts endpoint) (toJSON postObject)
82+ post (fullUrl clientOpts endpoint) (toJSON postObject)
83+_dockerPostQuery endpoint clientOpts@DockerClientOpts{ssl = SSL sslOpts} postObject =
84+ postSSL sslOpts (fullUrl clientOpts endpoint) postObject
49emptyPost = "" :: String
86emptyPost = "" :: String
50_dockerEmptyPostQuery endpoint clientOpts = post (fullUrl clientOpts endpoint) (toJSON emptyPost)
87_dockerEmptyPostQuery endpoint clientOpts = post (fullUrl clientOpts endpoint) (toJSON emptyPost)