module Network.Api.Support.Core (
runRequest
, runRequest'
) where
import Network.Api.Support.Request
import Network.Api.Support.Response
import Control.Failure
import Control.Monad
import Control.Monad.IO.Class
import Control.Monad.Trans.Resource
import Data.Text
import Data.Monoid
import Network.HTTP.Conduit
import Network.HTTP.Types
runRequest ::
(MonadIO m, MonadBaseControl IO m, MonadThrow m, MonadUnsafeIO m, Failure HttpException m) =>
ManagerSettings
-> StdMethod
-> Text
-> RequestTransformer m
-> Responder m b
-> m b
runRequest settings stdmethod url transform =
runRequest' settings url (transform <> setMethod (renderStdMethod stdmethod))
runRequest' ::
(MonadIO m, MonadBaseControl IO m, MonadThrow m, MonadUnsafeIO m, Failure HttpException m) =>
ManagerSettings
-> Text
-> RequestTransformer m
-> Responder m b
-> m b
runRequest' settings url transform responder =
do url' <- parseUrl $ unpack url
let url'' = url' { checkStatus = const . const . const $ Nothing }
let req = appEndo transform url''
liftM (responder req) . withCustomManager settings . httpLbs $ req
withCustomManager ::
(MonadIO m, MonadBaseControl IO m, MonadThrow m, MonadUnsafeIO m) =>
ManagerSettings ->
(Manager -> ResourceT m a) ->
m a
withCustomManager settings f = runResourceT $
allocate (newManager settings) closeManager >>= \(_, manager) -> f manager