@@ -1,13 +1,11 @@
1{-# LANGUAGE RankNTypes #-}
1{-# LANGUAGE RankNTypes #-}
2{-# LANGUAGE ScopedTypeVariables #-}
2{-# LANGUAGE ScopedTypeVariables #-}
3−{-# LANGUAGE TypeFamilies, UndecidableInstances #-}
5module Docker.Client.Http where
4module Docker.Client.Http where
7−import Control.Monad.Base (MonadBase(..), liftBaseDefault)
6+-- import Control.Monad.Base (MonadBase(..), liftBaseDefault)
8−import Control.Monad.Catch (MonadMask(..), MonadCatch(..), MonadThrow(..))
7+import Control.Monad.Catch (MonadMask(..))
9import Control.Monad.Reader (ReaderT(..), runReaderT)
8import Control.Monad.Reader (ReaderT(..), runReaderT)
10−import Control.Monad.Trans.Control (MonadBaseControl(..), ComposeSt, defaultLiftBaseWith, defaultRestoreM, MonadTransControl(..), defaultLiftWith, defaultRestoreT)
11import qualified Data.ByteString.Char8 as BSC
9import qualified Data.ByteString.Char8 as BSC
12import qualified Data.ByteString.Lazy as BL
10import qualified Data.ByteString.Lazy as BL
13import Data.Conduit (Sink)
11import Data.Conduit (Sink)
@@ -17,7 +15,7 @@ import Data.Text.Encoding (encodeUtf8)
17import Data.X509 (CertificateChain (..))
15import Data.X509 (CertificateChain (..))
18import Data.X509.CertificateStore (makeCertificateStore)
16import Data.X509.CertificateStore (makeCertificateStore)
19import Data.X509.File (readKeyFile, readSignedObject)
17import Data.X509.File (readKeyFile, readSignedObject)
20−import Network.HTTP.Client (defaultManagerSettings, httpLbs,
18+import Network.HTTP.Client (defaultManagerSettings,
21 managerRawConnection, method,
19 managerRawConnection, method,
22 newManager, parseUrl,
20 newManager, parseUrl,
23 requestBody, requestHeaders)
21 requestBody, requestHeaders)
@@ -33,7 +31,7 @@ import Network.TLS (ClientHooks (..),
33import Network.TLS.Extra (ciphersuite_strong)
31import Network.TLS.Extra (ciphersuite_strong)
34import System.X509 (getSystemCertificateStore)
32import System.X509 (getSystemCertificateStore)
36−import Control.Exception (try)
34+import Control.Monad.Catch (try)
37import Control.Monad.Except
35import Control.Monad.Except
38import Control.Monad.Reader.Class
36import Control.Monad.Reader.Class
39import Data.Text as T
37import Data.Text as T
@@ -83,8 +81,8 @@ instance MonadTrans DockerT where
83instance MonadIO m => MonadIO (DockerT m) where
81instance MonadIO m => MonadIO (DockerT m) where
84 liftIO = lift . liftIO
82 liftIO = lift . liftIO
86−instance MonadBase IO m => MonadBase IO (DockerT m) where
84+-- instance MonadBase IO m => MonadBase IO (DockerT m) where
87− liftBase = liftBaseDefault
85+-- liftBase = liftBaseDefault
89runDockerT :: Monad m => (DockerClientOpts, HttpHandler m) -> DockerT m a -> m a
87runDockerT :: Monad m => (DockerClientOpts, HttpHandler m) -> DockerT m a -> m a
90runDockerT (opts, h) r = runReaderT (unDockerT r) (opts, h)
88runDockerT (opts, h) r = runReaderT (unDockerT r) (opts, h)
@@ -106,38 +104,32 @@ mkHttpRequest verb e opts = request
106 requestHeaders = [("Content-Type", "application/json; charset=utf-8")]}) $ getEndpointRequestBody e) <$> request'
104 requestHeaders = [("Content-Type", "application/json; charset=utf-8")]}) $ getEndpointRequestBody e) <$> request'
107 -- Note: Do we need to set length header?
105 -- Note: Do we need to set length header?
109−defaultHttpHandler :: MonadIO m => HttpHandler m
107+defaultHttpHandler :: (MonadIO m, MonadMask m) => m (HttpHandler m)
110−defaultHttpHandler = HttpHandler $ \request sink -> do
108+defaultHttpHandler = do
111 manager <- liftIO $ newManager defaultManagerSettings
109 manager <- liftIO $ newManager defaultManagerSettings
112− httpHandler manager request sink
110+ return $ httpHandler manager
114−httpHandler = undefined
117−httpHandler :: MonadIO m => HTTP.Manager -> HttpHandler m
112+httpHandler :: (MonadIO m, MonadMask m) => HTTP.Manager -> HttpHandler m
118−httpHandler manager request' sink = liftIO $ do -- runResourceT ..
113+httpHandler manager = HttpHandler $ \request' sink -> do -- runResourceT ..
114+ let request = NHS.setRequestManager manager request'
119 try (NHS.httpSink request sink) >>= \res -> case res of
115 try (NHS.httpSink request sink) >>= \res -> case res of
120− Right res -> return $ Right res
116+ Right res -> return res
121 Left HTTP.FailedConnectionException{} -> return $ Left DockerConnectionError
117 Left HTTP.FailedConnectionException{} -> return $ Left DockerConnectionError
122 Left HTTP.FailedConnectionException2{} -> return $ Left DockerConnectionError
118 Left HTTP.FailedConnectionException2{} -> return $ Left DockerConnectionError
123 Left e -> return $ Left $ GenericDockerError (T.pack $ show e)
119 Left e -> return $ Left $ GenericDockerError (T.pack $ show e)
126− request = NHS.setRequestManager request'
129-- | Connect to a unix domain socket (the default docker socket is
121-- | Connect to a unix domain socket (the default docker socket is
130-- at \/var\/run\/docker.sock)
122-- at \/var\/run\/docker.sock)
132-- Docker seems to ignore the hostname in requests sent over unix domain
124-- Docker seems to ignore the hostname in requests sent over unix domain
133-- sockets (and the port obviously doesn't matter either)
125-- sockets (and the port obviously doesn't matter either)
134−unixHttpHandler :: MonadIO m => FilePath -- ^ The socket to connect to
126+unixHttpHandler :: (MonadIO m, MonadMask m) => FilePath -- ^ The socket to connect to
135− -> HttpHandler m
127+ -> m (HttpHandler m)
136−unixHttpHandler fp = HttpHandler $ \request sink -> do
128+unixHttpHandler fp = do
137 let mSettings = defaultManagerSettings
129 let mSettings = defaultManagerSettings
138 { managerRawConnection = return $ openUnixSocket fp}
130 { managerRawConnection = return $ openUnixSocket fp}
139 manager <- liftIO $ newManager mSettings
131 manager <- liftIO $ newManager mSettings
140− httpHandler manager request sink
132+ return $ httpHandler manager
143 openUnixSocket filePath _ _ _ = do
135 openUnixSocket filePath _ _ _ = do