{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RecordWildCards #-}
module BDCS.Import.Conduit(getFromURI,
ungzipIfCompressed)
where
import Conduit(Conduit, Producer, (.|), leftover, sourceFile)
import Control.Monad.Trans.Resource(MonadResource)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as BSL
import qualified Data.Conduit.Binary as CB(take)
import Data.Conduit.Zlib(ungzip)
import Data.Word(Word8)
import Network.HTTP.Simple(getResponseBody, httpSource, parseRequest)
import Network.URI(URI(..))
import BDCS.Import.URI(showURI, uriToPath)
import BDCS.Utils.Conduit(identityC)
getFromURI :: MonadResource m => URI -> Producer m BS.ByteString
getFromURI uri@URI{..} | uriScheme == "file:" = sourceFile $ uriToPath uri
| otherwise = do request <- parseRequest $ showURI uri
httpSource request getResponseBody
ungzipIfCompressed :: MonadResource m => Conduit BS.ByteString m BS.ByteString
ungzipIfCompressed = do
magic <- CB.take 2
let nextPipe = if BSL.unpack magic == gzipMagic then ungzip else identityC
leftover (BSL.toStrict magic) .| nextPipe
nextPipe
where
gzipMagic :: [Word8]
gzipMagic = [0x1f, 0x8b]