module Data.CURL.CookieJar.Conduit
(
parseCookiesC
, parseCookiesEitherC
, sinkCookieJar
, sinkCookieJarEither
, sourceCookieJarCookies
, prettyCookieC
, prettyCookiesC
, prettyCookieJarC
, readCookieJarFileC
, readCookieJarHandleC
, sourceCookiesFile
, sourceCookiesHandle
, sinkCookiesFile
, sinkCookiesHandle
, writeCookieJarFileC
, writeCookieJarHandleC
) where
import Data.ByteString (ByteString)
import Conduit
( MonadThrow
, PrimMonad
, MonadIO
, MonadResource
, mapC
, ConduitT
, (.|)
, yield
, sourceFile
, sourceHandle
, sinkFile
, sinkHandle
)
import System.IO (Handle)
import Data.Conduit.List (sourceList, consume)
import Data.Conduit.ByteString.Builder (builderToByteString)
import Data.Conduit.Attoparsec
( ParseError, conduitParser, conduitParserEither, sinkParser, sinkParserEither)
import Data.CURL.CookieJar.Parser (cookieParser, cookieJarParser)
import Data.CURL.CookieJar.PrettyPrinter (CookieJarHeader, prettyCookie, prettyCookieJarHeader)
import Network.HTTP.Client (Cookie, CookieJar, createCookieJar, destroyCookieJar)
parseCookiesC :: MonadThrow m => ConduitT ByteString Cookie m ()
parseCookiesC = conduitParser cookieParser .| mapC snd
parseCookiesEitherC :: Monad m => ConduitT ByteString (Either ParseError Cookie) m ()
parseCookiesEitherC = conduitParserEither cookieParser .| mapC (fmap snd)
sinkCookieJar :: MonadThrow m => ConduitT ByteString o m CookieJar
sinkCookieJar = sinkParser cookieJarParser
sinkCookieJarEither :: Monad m => ConduitT ByteString o m (Either ParseError CookieJar)
sinkCookieJarEither = sinkParserEither cookieJarParser
prettyCookieC
:: PrimMonad m
=> Cookie
-> ConduitT i ByteString m ()
prettyCookieC cookie =
(yield $ prettyCookie cookie) .| builderToByteString
prettyCookiesC
:: PrimMonad m
=> CookieJarHeader
-> ConduitT Cookie ByteString m ()
prettyCookiesC header =
cookiesAndHeader .| builderToByteString
where
cookiesAndHeader = do
yield $ prettyCookieJarHeader header
mapC prettyCookie
prettyCookieJarC
:: PrimMonad m
=> CookieJarHeader
-> CookieJar
-> ConduitT i ByteString m ()
prettyCookieJarC header jar =
sourceCookieJarCookies jar .| prettyCookiesC header
readCookieJarFileC
:: MonadThrow m
=> MonadResource m
=> FilePath
-> ConduitT i o m CookieJar
readCookieJarFileC path = sourceCookiesFile path .| sinkCookieJarCookies
readCookieJarHandleC
:: MonadIO m
=> MonadThrow m
=> Handle
-> ConduitT i o m CookieJar
readCookieJarHandleC handle = sourceCookiesHandle handle .| sinkCookieJarCookies
sourceCookieJarCookies
:: Monad m
=> CookieJar
-> ConduitT i Cookie m ()
sourceCookieJarCookies =
sourceList . destroyCookieJar
sinkCookieJarCookies
:: Monad m
=> ConduitT Cookie o m CookieJar
sinkCookieJarCookies = createCookieJar <$> consume
sourceCookiesFile
:: MonadThrow m
=> MonadResource m
=> FilePath
-> ConduitT i Cookie m ()
sourceCookiesFile path =
sourceFile path .| parseCookiesC
sourceCookiesHandle
:: MonadThrow m
=> MonadIO m
=> Handle
-> ConduitT i Cookie m ()
sourceCookiesHandle handle =
sourceHandle handle .| parseCookiesC
sinkCookiesFile
:: MonadResource m
=> PrimMonad m
=> CookieJarHeader
-> FilePath
-> ConduitT Cookie o m ()
sinkCookiesFile header path =
prettyCookiesC header .| sinkFile path
sinkCookiesHandle
:: MonadIO m
=> PrimMonad m
=> CookieJarHeader
-> Handle
-> ConduitT Cookie o m ()
sinkCookiesHandle header handle =
prettyCookiesC header .| sinkHandle handle
writeCookieJarFileC
:: MonadResource m
=> PrimMonad m
=> CookieJarHeader
-> CookieJar
-> FilePath
-> ConduitT i o m ()
writeCookieJarFileC header jar path =
sourceCookieJarCookies jar .| sinkCookiesFile header path
writeCookieJarHandleC
:: MonadIO m
=> PrimMonad m
=> CookieJarHeader
-> CookieJar
-> Handle
-> ConduitT i o m ()
writeCookieJarHandleC header jar handle =
sourceCookieJarCookies jar .| sinkCookiesHandle header handle