module Network.AWS.Internal.Body where
import Control.Applicative
import Control.Monad
import Control.Monad.IO.Class
import Control.Monad.Morph
import Control.Monad.Trans.Resource
import Data.Conduit
import qualified Data.Conduit.Binary as Conduit
import Data.Int
import Network.AWS.Prelude
import qualified Network.HTTP.Client as Client
import Network.HTTP.Conduit
import System.IO
import Prelude
sourceBody :: Digest SHA256
-> Int64
-> Source (ResourceT IO) ByteString
-> RqBody
sourceBody h n = RqBody h . requestBodySource n
sourceHandle :: Digest SHA256 -> Int64 -> Handle -> RqBody
sourceHandle h n = sourceBody h n . Conduit.sourceHandle
sourceFile :: Digest SHA256 -> Int64 -> FilePath -> RqBody
sourceFile h n = sourceBody h n . Conduit.sourceFile
sourceFileIO :: MonadIO m => FilePath -> m RqBody
sourceFileIO f = liftIO $
RqBody <$> runResourceT (Conduit.sourceFile f $$ sinkSHA256)
<*> Client.streamFile f
getFileSize :: MonadIO m => FilePath -> m Int64
getFileSize f = liftIO $ fromIntegral `liftM` withBinaryFile f ReadMode hFileSize
sinkBody :: MonadResource m => RsBody -> Sink ByteString m a -> m a
sinkBody (RsBody src) sink = hoist liftResourceT src $$+- sink
sinkMD5 :: Monad m => Consumer ByteString m (Digest MD5)
sinkMD5 = sinkHash
sinkSHA256 :: Monad m => Consumer ByteString m (Digest SHA256)
sinkSHA256 = sinkHash
sinkHash :: (Monad m, HashAlgorithm a) => Consumer ByteString m (Digest a)
sinkHash = sink hashInit
where
sink ctx = do
b <- await
case b of
Nothing -> return $! hashFinalize ctx
Just bs -> sink $! hashUpdate ctx bs