@@ -5,25 +5,28 @@ module Network.Docker.Internal where
6import Control.Lens
6import Control.Lens
7import Control.Monad.Free
7import Control.Monad.Free
8−import Data.Aeson (FromJSON, ToJSON, Value, decode,
8+import Data.Aeson (FromJSON, ToJSON, Value, decode,
9− eitherDecode, toJSON)
9+ eitherDecode, toJSON)
10−import Data.Aeson.Lens (key, _String)
10+import Data.Aeson.Lens (key, _String)
11−import qualified Data.ByteString.Lazy as L
11+import qualified Data.ByteString.Lazy as L
12+import Network.HTTP.Client.OpenSSL
12import Network.Wreq
13import Network.Wreq
13−-- import Pipes
14+import OpenSSL (withOpenSSL)
14−-- import qualified Pipes.ByteString as PB
15+import OpenSSL.Session (SSLContext, context)
15−-- import qualified Pipes.HTTP as PH
16+import qualified OpenSSL.Session as SSL
16−import Text.Printf (printf)
17+import Text.Printf (printf)
18import Network.Docker.Types
19import Network.Docker.Types
20emptyPost = "" :: String
21emptyPost = "" :: String
23runDocker :: HttpRequestM r -> IO (Response L.ByteString)
23runDocker :: HttpRequestM r -> IO (Response L.ByteString)
24runDocker (Free (Get url)) = get url
24runDocker (Free (Get url)) = get url
25+runDocker (Free (GetSSL sslOpts url)) = getSSL sslOpts url
25runDocker (Free (Post url body)) = post url body
26runDocker (Free (Post url body)) = post url body
27+runDocker (Free (PostSSL sslOpts url body)) = postSSL sslOpts url body
26runDocker (Free (Delete url)) = delete url
28runDocker (Free (Delete url)) = delete url
29+runDocker (Free (DeleteSSL sslOpts url)) = deleteSSL sslOpts url
28constructUrl :: URL -> ApiVersion -> String -> URL
31constructUrl :: URL -> ApiVersion -> String -> URL
29constructUrl url apiVersion endpoint = printf "%s%s%s" url apiVersion endpoint
32constructUrl url apiVersion endpoint = printf "%s%s%s" url apiVersion endpoint
@@ -51,20 +54,55 @@ getEndpoint (SContainerLogsEndpoint cid (LogOpts stdout stderr follow )) =
51getEndpoint (SDeleteContainerEndpoint cid (DeleteOpts removeVolumes force)) =
54getEndpoint (SDeleteContainerEndpoint cid (DeleteOpts removeVolumes force)) =
52 printf "/containers/%s?v=%s;force=%s" cid (show removeVolumes) (show force)
55 printf "/containers/%s?v=%s;force=%s" cid (show removeVolumes) (show force)
57+setupSSLCtx :: SSLOptions -> IO SSLContext
58+setupSSLCtx (SSLOptions key cert) = do
60+ SSL.contextSetPrivateKeyFile ctx key
61+ SSL.contextSetCertificateFile ctx cert
62+ SSL.contextAddOption ctx SSL.SSL_OP_NO_SSLv3
63+ SSL.contextAddOption ctx SSL.SSL_OP_NO_SSLv2
66+mkOpts c = defaults & manager .~ Left (opensslManagerSettings c)
71+ -> IO (Response L.ByteString)
72+getSSL sopts url = withOpenSSL $ getWith (mkOpts $ setupSSLCtx sopts) url
79+ -> IO (Response L.ByteString)
80+postSSL sopts url = withOpenSSL . postWith (mkOpts $ setupSSLCtx sopts) url . toJSON
85+ -> IO (Response L.ByteString)
86+deleteSSL sopts url = withOpenSSL $ deleteWith (mkOpts $ setupSSLCtx sopts) url
54fullUrl :: DockerClientOpts -> SEndpoint a -> URL
88fullUrl :: DockerClientOpts -> SEndpoint a -> URL
55fullUrl clientOpts endpoint = constructUrl (baseUrl clientOpts) (apiVersion clientOpts) (getEndpoint endpoint)
89fullUrl clientOpts endpoint = constructUrl (baseUrl clientOpts) (apiVersion clientOpts) (getEndpoint endpoint)
57_dockerGetQuery :: DockerClientOpts -> SEndpoint a -> HttpRequestM (SEndpoint a)
91_dockerGetQuery :: DockerClientOpts -> SEndpoint a -> HttpRequestM (SEndpoint a)
58−_dockerGetQuery clientOpts endpoint = Free (Get (fullUrl clientOpts endpoint))
92+_dockerGetQuery clientOpts@DockerClientOpts{ssl = NoSSL} endpoint = Free (Get (fullUrl clientOpts endpoint))
93+_dockerGetQuery clientOpts@DockerClientOpts{ssl = SSL sslOpts} endpoint = Free (GetSSL sslOpts (fullUrl clientOpts endpoint))
60_dockerPostQuery :: ToJSON b => DockerClientOpts -> SEndpoint a -> b -> HttpRequestM (SEndpoint a)
95_dockerPostQuery :: ToJSON b => DockerClientOpts -> SEndpoint a -> b -> HttpRequestM (SEndpoint a)
61−_dockerPostQuery clientOpts endpoint postObject = Free (Post (fullUrl clientOpts endpoint) (toJSON postObject))
96+_dockerPostQuery clientOpts@DockerClientOpts{ssl = NoSSL} endpoint postObject = Free (Post (fullUrl clientOpts endpoint) (toJSON postObject))
97+_dockerPostQuery clientOpts@DockerClientOpts{ssl = SSL sslOpts} endpoint postObject = Free (PostSSL sslOpts (fullUrl clientOpts endpoint) (toJSON postObject))
63_dockerEmptyPostQuery :: DockerClientOpts -> SEndpoint a -> HttpRequestM (SEndpoint a)
99_dockerEmptyPostQuery :: DockerClientOpts -> SEndpoint a -> HttpRequestM (SEndpoint a)
64−_dockerEmptyPostQuery clientOpts endpoint = Free (Post (fullUrl clientOpts endpoint) (toJSON emptyPost))
100+_dockerEmptyPostQuery clientOpts@DockerClientOpts{ssl = NoSSL} endpoint = Free (Post (fullUrl clientOpts endpoint) (toJSON emptyPost))
101+_dockerEmptyPostQuery clientOpts@DockerClientOpts{ssl = SSL sslOpts} endpoint = Free (PostSSL sslOpts (fullUrl clientOpts endpoint) (toJSON emptyPost))
66_dockerDeleteQuery :: DockerClientOpts -> SEndpoint a -> HttpRequestM (SEndpoint a)
103_dockerDeleteQuery :: DockerClientOpts -> SEndpoint a -> HttpRequestM (SEndpoint a)
67−_dockerDeleteQuery clientOpts endpoint = Free $ Delete $ fullUrl clientOpts endpoint
104+_dockerDeleteQuery clientOpts@DockerClientOpts{ssl = NoSSL} endpoint = Free (Delete (fullUrl clientOpts endpoint))
105+_dockerDeleteQuery clientOpts@DockerClientOpts{ssl = SSL sslOpts} endpoint = Free (DeleteSSL sslOpts (fullUrl clientOpts endpoint))
69getDockerVersionM :: DockerClientOpts -> SEndpoint VersionEndpoint -> HttpRequestM (SEndpoint VersionEndpoint)
107getDockerVersionM :: DockerClientOpts -> SEndpoint VersionEndpoint -> HttpRequestM (SEndpoint VersionEndpoint)
70getDockerVersionM clientOpts e = _dockerGetQuery clientOpts e
108getDockerVersionM clientOpts e = _dockerGetQuery clientOpts e
@@ -102,11 +140,3 @@ deleteContainerM clientOpts e = _dockerDeleteQuery clientOpts e
102getContainerLogsM :: DockerClientOpts -> SEndpoint ContainerLogsEndpoint -> HttpRequestM (SEndpoint ContainerLogsEndpoint)
140getContainerLogsM :: DockerClientOpts -> SEndpoint ContainerLogsEndpoint -> HttpRequestM (SEndpoint ContainerLogsEndpoint)
103getContainerLogsM clientOpts e = _dockerGetQuery clientOpts e
141getContainerLogsM clientOpts e = _dockerGetQuery clientOpts e
105−-- getContainerLogsM :: DockerClientOpts -> SEndpoint ContainerLogsEndpoint -> Bool -> HttpRequestM (SEndpoint ContainerLogsEndpoint)
106−-- getContainerLogsM clientOpts e f = case f of
107−-- False -> _dockerGetQuery clientOpts e
109−-- req <- PH.parseUrl ((fullUrl clientOpts e) ++ "&follow=1")
110−-- let req' = req {PH.method = "GET"}
111−-- PH.withManager PH.defaultManagerSettings $ \m -> PH.withHTTP req' m $ \resp -> runEffect $ PH.responseBody resp >-> PB.stdout