module HTTPClient.Session
(
Session,
run,
withManager,
requestLBSResponse,
requestLBSBody,
requestBSBody,
A.Manager(..),
A.HttpException(..),
A.Request(..),
)
where
import BasePrelude
import MTLPrelude
import Control.Monad.Trans.Either
import qualified Network.HTTP.Client as A
import qualified Data.ByteString.Lazy as B
import qualified Data.ByteString as C
newtype Session a =
Session (ReaderT A.Manager (EitherT A.HttpException IO) a)
deriving (Functor, Applicative, Monad, MonadIO, MonadError A.HttpException)
run :: Session a -> A.Manager -> IO (Either A.HttpException a)
run (Session reader) manager =
runEitherT $ runReaderT reader manager
withManager :: (A.Manager -> IO (Either A.HttpException a)) -> Session a
withManager handler =
Session $ ReaderT $ \manager -> EitherT $ handler manager
requestLBSResponse :: A.Request -> Session (A.Response B.ByteString)
requestLBSResponse request =
withManager $ \manager -> try $ A.httpLbs request manager
requestLBSBody :: A.Request -> Session B.ByteString
requestLBSBody request =
fmap A.responseBody $ requestLBSResponse request
requestBSBody :: A.Request -> Session C.ByteString
requestBSBody request =
fmap B.toStrict $ requestLBSBody request