servant-client-0.20.2: Automatic derivation of querying functions for servant
Safe HaskellNone
LanguageHaskell2010

Servant.Client.Internal.HttpClient.Streaming

Synopsis

Documentation

client :: HasClient ClientM api => Proxy api -> Client ClientM api Source #

Generates a set of client functions for an API.

Example:

type API = Capture "no" Int :> Get '[JSON] Int
       :<|> Get '[JSON] [Bool]

api :: Proxy API
api = Proxy

getInt :: Int -> ClientM Int
getBools :: ClientM [Bool]
getInt :<|> getBools = client api

newtype ClientM a Source #

ClientM is the monad in which client functions run. Contains the Manager and BaseUrl used for requests in the reader environment.

Constructors

ClientM 

Fields

Instances

Instances details
MonadIO ClientM Source # 
Instance details

Defined in Servant.Client.Internal.HttpClient.Streaming

Methods

liftIO :: IO a -> ClientM a

Applicative ClientM Source # 
Instance details

Defined in Servant.Client.Internal.HttpClient.Streaming

Methods

pure :: a -> ClientM a

(<*>) :: ClientM (a -> b) -> ClientM a -> ClientM b

liftA2 :: (a -> b -> c) -> ClientM a -> ClientM b -> ClientM c

(*>) :: ClientM a -> ClientM b -> ClientM b

(<*) :: ClientM a -> ClientM b -> ClientM a

Functor ClientM Source # 
Instance details

Defined in Servant.Client.Internal.HttpClient.Streaming

Methods

fmap :: (a -> b) -> ClientM a -> ClientM b

(<$) :: a -> ClientM b -> ClientM a

Monad ClientM Source # 
Instance details

Defined in Servant.Client.Internal.HttpClient.Streaming

Methods

(>>=) :: ClientM a -> (a -> ClientM b) -> ClientM b

(>>) :: ClientM a -> ClientM b -> ClientM b

return :: a -> ClientM a

Alt ClientM Source #

Try clients in order, last error is preserved.

Instance details

Defined in Servant.Client.Internal.HttpClient.Streaming

Methods

(<!>) :: ClientM a -> ClientM a -> ClientM a

some :: Applicative ClientM => ClientM a -> ClientM [a]

many :: Applicative ClientM => ClientM a -> ClientM [a]

RunClient ClientM Source # 
Instance details

Defined in Servant.Client.Internal.HttpClient.Streaming

Methods

runRequestAcceptStatus :: Maybe [Status] -> Request -> ClientM Response

throwClientError :: ClientError -> ClientM a

RunStreamingClient ClientM Source # 
Instance details

Defined in Servant.Client.Internal.HttpClient.Streaming

Methods

withStreamingRequest :: Request -> (StreamingResponse -> IO a) -> ClientM a

MonadError ClientError ClientM Source # 
Instance details

Defined in Servant.Client.Internal.HttpClient.Streaming

MonadReader ClientEnv ClientM Source # 
Instance details

Defined in Servant.Client.Internal.HttpClient.Streaming

MonadBase IO ClientM Source # 
Instance details

Defined in Servant.Client.Internal.HttpClient.Streaming

Methods

liftBase :: IO α -> ClientM α

Generic (ClientM a) Source # 
Instance details

Defined in Servant.Client.Internal.HttpClient.Streaming

Associated Types

type Rep (ClientM a) 
Instance details

Defined in Servant.Client.Internal.HttpClient.Streaming

type Rep (ClientM a) = Rep (ReaderT ClientEnv (ExceptT ClientError (Codensity IO)) a)

Methods

from :: ClientM a -> Rep (ClientM a) x

to :: Rep (ClientM a) x -> ClientM a

type Rep (ClientM a) Source # 
Instance details

Defined in Servant.Client.Internal.HttpClient.Streaming

type Rep (ClientM a) = Rep (ReaderT ClientEnv (ExceptT ClientError (Codensity IO)) a)

runClientM :: NFData a => ClientM a -> ClientEnv -> IO (Either ClientError a) Source #

A runClientM variant for streaming client.

It allows using this module's ClientM in a direct style. The NFData constraint however prevents using this function with genuine streaming response types (SourceT, Conduit, pipes Proxy or Machine). For those you have to use withClientM.

Note: we force the result, so the likelihood of accidentally leaking a connection is smaller. Use with care.

hoistClient :: HasClient ClientM api => Proxy api -> (forall a. m a -> n a) -> Client m api -> Client n api Source #

Change the monad the client functions live in, by supplying a conversion function (a natural transformation to be precise).

For example, assuming you have some manager :: Manager and baseurl :: BaseUrl around:

type API = Get '[JSON] Int :<|> Capture "n" Int :> Post '[JSON] Int
api :: Proxy API
api = Proxy
getInt :: IO Int
postInt :: Int -> IO Int
getInt :<|> postInt = hoistClient api (flip runClientM cenv) (client api)
  where cenv = mkClientEnv manager baseurl

withClientM :: ClientM a -> ClientEnv -> (Either ClientError a -> IO b) -> IO b Source #

performRequest :: Maybe [Status] -> Request -> ClientM Response Source #

performWithStreamingRequest :: Request -> (StreamingResponse -> IO a) -> ClientM a Source #

TODO: support UVerb (acceptStatus argument, like in performRequest above).

data ClientEnv Source #

The environment in which a request is run. The baseUrl and makeClientRequest function are used to create a http-client request. Cookies are then added to that request if a CookieJar is set on the environment. Finally the request is executed with the manager. The makeClientRequest function can be used to modify the request to execute and set values which are not specified on a servant Request like responseTimeout or redirectCount

Constructors

ClientEnv 

Fields

Instances

Instances details
MonadReader ClientEnv ClientM Source # 
Instance details

Defined in Servant.Client.Internal.HttpClient

MonadReader ClientEnv ClientM 
Instance details

Defined in Servant.Client.Internal.HttpClient.Streaming

mkClientEnv :: Manager -> BaseUrl -> ClientEnv Source #

ClientEnv smart constructor.

clientResponseToResponse :: (a -> b) -> Response a -> ResponseF b Source #

defaultMakeClientRequest :: BaseUrl -> Request -> IO Request Source #

Create a http-client Request from a servant Request The host, path and port fields are extracted from the BaseUrl otherwise the body, headers and query string are derived from the servant Request

catchConnectionError :: IO a -> IO (Either ClientError a) Source #