{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Mismi.S3.Patch.Network (
chunkedFile
) where
import Control.Monad
import Control.Monad.Trans.Resource
import Control.Monad.IO.Class
import Data.Conduit (ConduitT, yield, bracketP)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as LBS
import Mismi.Amazonka (getFileSize, unsafeChunkedBody)
import Network.AWS.Data.Body
import P
import Prelude (toInteger)
import System.IO
chunkedFile :: MonadIO m => ChunkSize -> FilePath -> m RqBody
chunkedFile c f = do
n <- getFileSize f
if n > toInteger c
then
return $ unsafeChunkedBody c n (sourceFileChunks c f)
else
liftIO $ (=<<) (return . toBody) $ LBS.readFile f
sourceFileChunks :: MonadResource m
=> ChunkSize
-> FilePath
-> ConduitT () BS.ByteString m ()
sourceFileChunks (ChunkSize sz) f =
bracketP (openBinaryFile f ReadMode) hClose go
where
go h = do
bs <- liftIO (BS.hGet h sz)
unless (BS.null bs) $ do
yield bs
go h