| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Servant.API
Contents
Synopsis
- data (path :: k) :> (a :: *)
- data a :<|> b = a :<|> b
- data EmptyAPI = EmptyAPI
- data Strict
- data Lenient
- data Optional
- data Required
- data CaptureAll (sym :: Symbol) (a :: *)
- data Capture' (mods :: [*]) (sym :: Symbol) (a :: *)
- type Capture = Capture' '[]
- data Header' (mods :: [*]) (sym :: Symbol) a
- type Header = Header' '[Optional, Strict]
- data HttpVersion = HttpVersion {}
- data QueryFlag (sym :: Symbol)
- data QueryParams (sym :: Symbol) (a :: *)
- data QueryParam' (mods :: [*]) (sym :: Symbol) (a :: *)
- type QueryParam = QueryParam' '[Optional, Strict]
- data ReqBody' (mods :: [*]) (contentTypes :: [*]) (a :: *)
- type ReqBody = ReqBody' '[Required, Strict]
- data RemoteHost
- data IsSecure
- type Vault = Vault RealWorld
- data WithNamedContext (name :: Symbol) (subContext :: [*]) subApi
- data StdMethod
- class ReflectMethod a where
- reflectMethod :: Proxy a -> Method
- type GetPartialContent = Verb GET 206
- type PostResetContent = Verb POST 205
- type GetResetContent = Verb GET 205
- type PutNoContent = Verb PUT 204
- type PatchNoContent = Verb PATCH 204
- type DeleteNoContent = Verb DELETE 204
- type PostNoContent = Verb POST 204
- type GetNoContent = Verb GET 204
- type PutNonAuthoritative = Verb PUT 203
- type PatchNonAuthoritative = Verb PATCH 203
- type DeleteNonAuthoritative = Verb DELETE 203
- type PostNonAuthoritative = Verb POST 203
- type GetNonAuthoritative = Verb GET 203
- type PutAccepted = Verb PUT 202
- type PatchAccepted = Verb PATCH 202
- type DeleteAccepted = Verb DELETE 202
- type PostAccepted = Verb POST 202
- type GetAccepted = Verb GET 202
- type PutCreated = Verb PUT 201
- type PostCreated = Verb POST 201
- type Patch = Verb PATCH 200
- type Delete = Verb DELETE 200
- type Put = Verb PUT 200
- type Post = Verb POST 200
- type Get = Verb GET 200
- data Verb (method :: k1) (statusCode :: Nat) (contentTypes :: [*]) (a :: *)
- data NetstringFraming
- data NewlineFraming
- data NoFraming
- class FramingUnrender strategy where
- framingUnrender :: Monad m => Proxy strategy -> (ByteString -> Either String a) -> SourceT m ByteString -> SourceT m a
- class FramingRender strategy where
- framingRender :: Monad m => Proxy strategy -> (a -> ByteString) -> SourceT m a -> SourceT m ByteString
- class FromSourceIO chunk a | a -> chunk where
- fromSourceIO :: SourceIO chunk -> a
- class ToSourceIO chunk a | a -> chunk where
- toSourceIO :: a -> SourceIO chunk
- type SourceIO = SourceT IO
- data StreamBody' (mods :: [*]) (framing :: *) (contentType :: *) (a :: *)
- type StreamBody = StreamBody' '[]
- type StreamPost = Stream POST 200
- type StreamGet = Stream GET 200
- data Stream (method :: k1) (status :: Nat) (framing :: *) (contentType :: *) (a :: *)
- data BasicAuthData = BasicAuthData {}
- data BasicAuth (realm :: Symbol) (userData :: *)
- data Description (sym :: Symbol)
- data Summary (sym :: Symbol)
- data NoContent = NoContent
- class Accept ctype => MimeUnrender ctype a where
- mimeUnrender :: Proxy ctype -> ByteString -> Either String a
- mimeUnrenderWithType :: Proxy ctype -> MediaType -> ByteString -> Either String a
- class Accept ctype => MimeRender ctype a where
- mimeRender :: Proxy ctype -> a -> ByteString
- class Accept ctype where
- contentType :: Proxy ctype -> MediaType
- contentTypes :: Proxy ctype -> NonEmpty MediaType
- data OctetStream
- data FormUrlEncoded
- data PlainText
- data JSON
- class HasResponseHeader h a headers
- class AddHeader h v orig new | h v orig -> new, new -> h, new -> v, new -> orig
- class GetHeaders ls where
- getHeaders :: ls -> [Header]
- class BuildHeadersTo hs where
- buildHeadersTo :: [Header] -> HList hs
- data HList a where
- data ResponseHeader (sym :: Symbol) a
- data Headers ls a = Headers {
- getResponse :: a
- getHeadersHList :: HList ls
- addHeader :: AddHeader h v orig new => v -> orig -> new
- noHeader :: AddHeader h v orig new => orig -> new
- lookupResponseHeader :: HasResponseHeader h a headers => Headers headers r -> ResponseHeader h a
- data Raw
- class ToHttpApiData a where
- toUrlPiece :: a -> Text
- toEncodedUrlPiece :: a -> Builder
- toHeader :: a -> ByteString
- toQueryParam :: a -> Text
- class FromHttpApiData a where
- parseUrlPiece :: Text -> Either Text a
- parseHeader :: ByteString -> Either Text a
- parseQueryParam :: Text -> Either Text a
- data AuthProtect (tag :: k)
- data URI = URI {}
- type family IsElem endpoint api :: Constraint where ...
- type family IsElem' a s :: Constraint
- class HasLink endpoint where
- data Link
- safeLink :: forall endpoint api. (IsElem endpoint api, HasLink endpoint) => Proxy api -> Proxy endpoint -> MkLink endpoint Link
- type family If (cond :: Bool) (tru :: k) (fls :: k) :: k where ...
- data SBool (b :: Bool) where
- class SBoolI (b :: Bool) where
Combinators
data (path :: k) :> (a :: *) infixr 4 #
The contained API (second argument) can be found under ("/" ++ path)
(path being the first argument).
Example:
>>>-- GET /hello/world>>>-- returning a JSON encoded World value>>>type MyApi = "hello" :> "world" :> Get '[JSON] World
Instances
| HasLink sub => HasLink (HttpVersion :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (HttpVersion :> sub) a :: Type # Methods toLink :: (Link -> a) -> Proxy (HttpVersion :> sub) -> Link -> MkLink (HttpVersion :> sub) a # | |
| HasLink sub => HasLink (Vault :> sub :: Type) # | |
| HasLink sub => HasLink (BasicAuth realm a :> sub :: Type) # | |
| (ToHttpApiData v, HasLink sub) => HasLink (CaptureAll sym v :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (CaptureAll sym v :> sub) a :: Type # Methods toLink :: (Link -> a) -> Proxy (CaptureAll sym v :> sub) -> Link -> MkLink (CaptureAll sym v :> sub) a # | |
| (ToHttpApiData v, HasLink sub) => HasLink (Capture' mods sym v :> sub :: Type) # | |
| HasLink sub => HasLink (Description s :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (Description s :> sub) a :: Type # Methods toLink :: (Link -> a) -> Proxy (Description s :> sub) -> Link -> MkLink (Description s :> sub) a # | |
| HasLink sub => HasLink (Summary s :> sub :: Type) # | |
| HasLink sub => HasLink (AuthProtect tag :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (AuthProtect tag :> sub) a :: Type # Methods toLink :: (Link -> a) -> Proxy (AuthProtect tag :> sub) -> Link -> MkLink (AuthProtect tag :> sub) a # | |
| HasLink sub => HasLink (IsSecure :> sub :: Type) # | |
| HasLink sub => HasLink (Header' mods sym a :> sub :: Type) # | |
| (KnownSymbol sym, HasLink sub) => HasLink (QueryFlag sym :> sub :: Type) # | |
| (KnownSymbol sym, ToHttpApiData v, HasLink sub) => HasLink (QueryParams sym v :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (QueryParams sym v :> sub) a :: Type # Methods toLink :: (Link -> a) -> Proxy (QueryParams sym v :> sub) -> Link -> MkLink (QueryParams sym v :> sub) a # | |
| (KnownSymbol sym, ToHttpApiData v, HasLink sub, SBoolI (FoldRequired mods)) => HasLink (QueryParam' mods sym v :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (QueryParam' mods sym v :> sub) a :: Type # Methods toLink :: (Link -> a) -> Proxy (QueryParam' mods sym v :> sub) -> Link -> MkLink (QueryParam' mods sym v :> sub) a # | |
| HasLink sub => HasLink (RemoteHost :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (RemoteHost :> sub) a :: Type # Methods toLink :: (Link -> a) -> Proxy (RemoteHost :> sub) -> Link -> MkLink (RemoteHost :> sub) a # | |
| HasLink sub => HasLink (ReqBody' mods ct a :> sub :: Type) # | |
| HasLink sub => HasLink (StreamBody' mods framing ct a :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (StreamBody' mods framing ct a :> sub) a :: Type # Methods toLink :: (Link -> a0) -> Proxy (StreamBody' mods framing ct a :> sub) -> Link -> MkLink (StreamBody' mods framing ct a :> sub) a0 # | |
| (KnownSymbol sym, HasLink sub) => HasLink (sym :> sub :: Type) # | |
| type MkLink (HttpVersion :> sub :: Type) a # | |
Defined in Servant.Links | |
| type MkLink (Vault :> sub :: Type) a # | |
| type MkLink (BasicAuth realm a :> sub :: Type) r # | |
| type MkLink (CaptureAll sym v :> sub :: Type) a # | |
Defined in Servant.Links | |
| type MkLink (Capture' mods sym v :> sub :: Type) a # | |
| type MkLink (Description s :> sub :: Type) a # | |
Defined in Servant.Links | |
| type MkLink (Summary s :> sub :: Type) a # | |
| type MkLink (AuthProtect tag :> sub :: Type) a # | |
Defined in Servant.Links | |
| type MkLink (IsSecure :> sub :: Type) a # | |
| type MkLink (Header' mods sym a :> sub :: Type) r # | |
| type MkLink (QueryFlag sym :> sub :: Type) a # | |
| type MkLink (QueryParams sym v :> sub :: Type) a # | |
Defined in Servant.Links | |
| type MkLink (QueryParam' mods sym v :> sub :: Type) a # | |
Defined in Servant.Links type MkLink (QueryParam' mods sym v :> sub :: Type) a = If (FoldRequired mods) v (Maybe v) -> MkLink sub a | |
| type MkLink (RemoteHost :> sub :: Type) a # | |
Defined in Servant.Links | |
| type MkLink (ReqBody' mods ct a :> sub :: Type) r # | |
| type MkLink (StreamBody' mods framing ct a :> sub :: Type) r # | |
Defined in Servant.Links | |
| type MkLink (sym :> sub :: Type) a # | |
Defined in Servant.Links | |
Type-level combinator for expressing subrouting: :>
Union of two APIs, first takes precedence in case of overlap.
Example:
>>>:{type MyApi = "books" :> Get '[JSON] [Book] -- GET /books :<|> "books" :> ReqBody '[JSON] Book :> Post '[JSON] () -- POST /books :}
Constructors
| a :<|> b infixr 3 |
Instances
| Bitraversable (:<|>) # | |
Defined in Servant.API.Alternative Methods bitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> (a :<|> b) -> f (c :<|> d) # | |
| Bifoldable (:<|>) # | |
| Bifunctor (:<|>) # | |
| Biapplicative (:<|>) # | |
Defined in Servant.API.Alternative | |
| Functor ((:<|>) a) # | |
| Foldable ((:<|>) a) # | |
Defined in Servant.API.Alternative Methods fold :: Monoid m => (a :<|> m) -> m # foldMap :: Monoid m => (a0 -> m) -> (a :<|> a0) -> m # foldr :: (a0 -> b -> b) -> b -> (a :<|> a0) -> b # foldr' :: (a0 -> b -> b) -> b -> (a :<|> a0) -> b # foldl :: (b -> a0 -> b) -> b -> (a :<|> a0) -> b # foldl' :: (b -> a0 -> b) -> b -> (a :<|> a0) -> b # foldr1 :: (a0 -> a0 -> a0) -> (a :<|> a0) -> a0 # foldl1 :: (a0 -> a0 -> a0) -> (a :<|> a0) -> a0 # toList :: (a :<|> a0) -> [a0] # length :: (a :<|> a0) -> Int # elem :: Eq a0 => a0 -> (a :<|> a0) -> Bool # maximum :: Ord a0 => (a :<|> a0) -> a0 # minimum :: Ord a0 => (a :<|> a0) -> a0 # | |
| Traversable ((:<|>) a) # | |
| (HasLink a, HasLink b) => HasLink (a :<|> b :: Type) # | |
| (Bounded a, Bounded b) => Bounded (a :<|> b) # | |
| (Eq a, Eq b) => Eq (a :<|> b) # | |
| (Show a, Show b) => Show (a :<|> b) # | |
| (Semigroup a, Semigroup b) => Semigroup (a :<|> b) # | |
| (Monoid a, Monoid b) => Monoid (a :<|> b) # | |
| type MkLink (a :<|> b :: Type) r # | |
Type-level combinator for alternative endpoints: :<|>
An empty API: one which serves nothing. Morally speaking, this should be
the unit of :<|>. Implementors of interpretations of API types should
treat EmptyAPI as close to the unit as possible.
Constructors
| EmptyAPI |
Instances
| Bounded EmptyAPI # | |
| Enum EmptyAPI # | |
Defined in Servant.API.Empty | |
| Eq EmptyAPI # | |
| Show EmptyAPI # | |
| HasLink EmptyAPI # | |
| type MkLink EmptyAPI a # | |
Defined in Servant.Links | |
Type-level combinator for an empty API: EmptyAPI
Strictly parsed argument. Not wrapped.
Instances
| (KnownSymbol h, ToHttpApiData v) => AddHeader h v (Headers (fst ': rest) a) (Headers (Header h v ': (fst ': rest)) a) # | |
Defined in Servant.API.ResponseHeaders Methods addOptionalHeader :: ResponseHeader h v -> Headers (fst ': rest) a -> Headers (Header h v ': (fst ': rest)) a | |
| HasResponseHeader h a (Header h a ': rest) # | |
Defined in Servant.API.ResponseHeaders Methods hlistLookupHeader :: HList (Header h a ': rest) -> ResponseHeader h a | |
| (KnownSymbol h, GetHeadersFromHList rest, ToHttpApiData v) => GetHeaders' (Header h v ': rest) # | |
Defined in Servant.API.ResponseHeaders Methods getHeaders' :: Headers (Header h v ': rest) a -> [Header0] | |
| (FromHttpApiData v, BuildHeadersTo xs, KnownSymbol h) => BuildHeadersTo (Header h v ': xs) # | |
Defined in Servant.API.ResponseHeaders Methods buildHeadersTo :: [Header0] -> HList (Header h v ': xs) # | |
Optional argument. Wrapped in Maybe.
Instances
| (KnownSymbol h, ToHttpApiData v) => AddHeader h v (Headers (fst ': rest) a) (Headers (Header h v ': (fst ': rest)) a) # | |
Defined in Servant.API.ResponseHeaders Methods addOptionalHeader :: ResponseHeader h v -> Headers (fst ': rest) a -> Headers (Header h v ': (fst ': rest)) a | |
| HasResponseHeader h a (Header h a ': rest) # | |
Defined in Servant.API.ResponseHeaders Methods hlistLookupHeader :: HList (Header h a ': rest) -> ResponseHeader h a | |
| (KnownSymbol h, GetHeadersFromHList rest, ToHttpApiData v) => GetHeaders' (Header h v ': rest) # | |
Defined in Servant.API.ResponseHeaders Methods getHeaders' :: Headers (Header h v ': rest) a -> [Header0] | |
| (FromHttpApiData v, BuildHeadersTo xs, KnownSymbol h) => BuildHeadersTo (Header h v ': xs) # | |
Defined in Servant.API.ResponseHeaders Methods buildHeadersTo :: [Header0] -> HList (Header h v ': xs) # | |
Type-level modifiers for QueryParam, ResponseHeader and ReqBody.
Accessing information from the request
data CaptureAll (sym :: Symbol) (a :: *) #
Capture all remaining values from the request path under a certain type
a.
Example:
>>>-- GET /src/*>>>type MyAPI = "src" :> CaptureAll "segments" Text :> Get '[JSON] SourceFile
Instances
| (ToHttpApiData v, HasLink sub) => HasLink (CaptureAll sym v :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (CaptureAll sym v :> sub) a :: Type # Methods toLink :: (Link -> a) -> Proxy (CaptureAll sym v :> sub) -> Link -> MkLink (CaptureAll sym v :> sub) a # | |
| type MkLink (CaptureAll sym v :> sub :: Type) a # | |
Defined in Servant.Links | |
data Capture' (mods :: [*]) (sym :: Symbol) (a :: *) #
Capture which can be modified. For example with Description.
Capture a value from the request path under a certain type a.
Example:
>>>-- GET /books/:isbn>>>type MyApi = "books" :> Capture "isbn" Text :> Get '[JSON] Book
Capturing parts of the url path as parsed values: and CaptureCaptureAll
data Header' (mods :: [*]) (sym :: Symbol) a #
Instances
| (KnownSymbol h, ToHttpApiData v) => AddHeader h v (Headers (fst ': rest) a) (Headers (Header h v ': (fst ': rest)) a) # | |
Defined in Servant.API.ResponseHeaders Methods addOptionalHeader :: ResponseHeader h v -> Headers (fst ': rest) a -> Headers (Header h v ': (fst ': rest)) a | |
| HasResponseHeader h a (Header h a ': rest) # | |
Defined in Servant.API.ResponseHeaders Methods hlistLookupHeader :: HList (Header h a ': rest) -> ResponseHeader h a | |
| HasLink sub => HasLink (Header' mods sym a :> sub :: Type) # | |
| (KnownSymbol h, GetHeadersFromHList rest, ToHttpApiData v) => GetHeaders' (Header h v ': rest) # | |
Defined in Servant.API.ResponseHeaders Methods getHeaders' :: Headers (Header h v ': rest) a -> [Header0] | |
| (FromHttpApiData v, BuildHeadersTo xs, KnownSymbol h) => BuildHeadersTo (Header h v ': xs) # | |
Defined in Servant.API.ResponseHeaders Methods buildHeadersTo :: [Header0] -> HList (Header h v ': xs) # | |
| type MkLink (Header' mods sym a :> sub :: Type) r # | |
type Header = Header' '[Optional, Strict] #
Extract the given header's value as a value of type a.
I.e. header sent by client, parsed by server.
Example:
>>>newtype Referer = Referer Text deriving (Eq, Show)>>>>>>-- GET /view-my-referer>>>type MyApi = "view-my-referer" :> Header "from" Referer :> Get '[JSON] Referer
Retrieving specific headers from the request
data HttpVersion #
HTTP Version.
Note that the Show instance is intended merely for debugging.
Constructors
| HttpVersion | |
Instances
| Eq HttpVersion | |
Defined in Network.HTTP.Types.Version | |
| Ord HttpVersion | |
Defined in Network.HTTP.Types.Version Methods compare :: HttpVersion -> HttpVersion -> Ordering # (<) :: HttpVersion -> HttpVersion -> Bool # (<=) :: HttpVersion -> HttpVersion -> Bool # (>) :: HttpVersion -> HttpVersion -> Bool # (>=) :: HttpVersion -> HttpVersion -> Bool # max :: HttpVersion -> HttpVersion -> HttpVersion # min :: HttpVersion -> HttpVersion -> HttpVersion # | |
| Show HttpVersion | |
Defined in Network.HTTP.Types.Version Methods showsPrec :: Int -> HttpVersion -> ShowS # show :: HttpVersion -> String # showList :: [HttpVersion] -> ShowS # | |
| HasLink sub => HasLink (HttpVersion :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (HttpVersion :> sub) a :: Type # Methods toLink :: (Link -> a) -> Proxy (HttpVersion :> sub) -> Link -> MkLink (HttpVersion :> sub) a # | |
| type MkLink (HttpVersion :> sub :: Type) a # | |
Defined in Servant.Links | |
Retrieving the HTTP version of the request
data QueryFlag (sym :: Symbol) #
Lookup a potentially value-less query string parameter
with boolean semantics. If the param sym is there without any value,
or if it's there with value "true" or "1", it's interpreted as True.
Otherwise, it's interpreted as False.
Example:
>>>-- /books?published>>>type MyApi = "books" :> QueryFlag "published" :> Get '[JSON] [Book]
data QueryParams (sym :: Symbol) (a :: *) #
Lookup the values associated to the sym query string parameter
and try to extract it as a value of type [a]. This is typically
meant to support query string parameters of the form
param[]=val1¶m[]=val2 and so on. Note that servant doesn't actually
require the []s and will fetch the values just fine with
param=val1¶m=val2, too.
Example:
>>>-- /books?authors[]=<author1>&authors[]=<author2>&...>>>type MyApi = "books" :> QueryParams "authors" Text :> Get '[JSON] [Book]
Instances
| (KnownSymbol sym, ToHttpApiData v, HasLink sub) => HasLink (QueryParams sym v :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (QueryParams sym v :> sub) a :: Type # Methods toLink :: (Link -> a) -> Proxy (QueryParams sym v :> sub) -> Link -> MkLink (QueryParams sym v :> sub) a # | |
| type MkLink (QueryParams sym v :> sub :: Type) a # | |
Defined in Servant.Links | |
data QueryParam' (mods :: [*]) (sym :: Symbol) (a :: *) #
QueryParam which can be Required, Lenient, or modified otherwise.
Instances
| (KnownSymbol sym, ToHttpApiData v, HasLink sub, SBoolI (FoldRequired mods)) => HasLink (QueryParam' mods sym v :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (QueryParam' mods sym v :> sub) a :: Type # Methods toLink :: (Link -> a) -> Proxy (QueryParam' mods sym v :> sub) -> Link -> MkLink (QueryParam' mods sym v :> sub) a # | |
| type MkLink (QueryParam' mods sym v :> sub :: Type) a # | |
Defined in Servant.Links type MkLink (QueryParam' mods sym v :> sub :: Type) a = If (FoldRequired mods) v (Maybe v) -> MkLink sub a | |
type QueryParam = QueryParam' '[Optional, Strict] #
Lookup the value associated to the sym query string parameter
and try to extract it as a value of type a.
Example:
>>>-- /books?author=<author name>>>>type MyApi = "books" :> QueryParam "author" Text :> Get '[JSON] [Book]
Retrieving parameters from the query string of the URI: QueryParam
data ReqBody' (mods :: [*]) (contentTypes :: [*]) (a :: *) #
type ReqBody = ReqBody' '[Required, Strict] #
Extract the request body as a value of type a.
Example:
>>>-- POST /books>>>type MyApi = "books" :> ReqBody '[JSON] Book :> Post '[JSON] Book
Accessing the request body as a JSON-encoded type: ReqBody
data RemoteHost #
Provides access to the host or IP address from which the HTTP request was sent.
Instances
| HasLink sub => HasLink (RemoteHost :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (RemoteHost :> sub) a :: Type # Methods toLink :: (Link -> a) -> Proxy (RemoteHost :> sub) -> Link -> MkLink (RemoteHost :> sub) a # | |
| type MkLink (RemoteHost :> sub :: Type) a # | |
Defined in Servant.Links | |
Retrieving the IP of the client
Was this request made over an SSL connection?
Note that this value will not tell you if the client originally
made this request over SSL, but rather whether the current
connection is SSL. The distinction lies with reverse proxies.
In many cases, the client will connect to a load balancer over SSL,
but connect to the WAI handler without SSL. In such a case,
the handlers would get NotSecure, but from a user perspective,
there is a secure connection.
Constructors
| Secure | the connection to the server is secure (HTTPS) |
| NotSecure | the connection to the server is not secure (HTTP) |
Is the request made through HTTPS?
type Vault = Vault RealWorld #
A persistent store for values of arbitrary types.
This variant is the simplest and creates keys in the IO monad.
See the module Data.Vault.ST if you want to use it with the ST monad instead.
Access the location for arbitrary data to be shared by applications and middleware
data WithNamedContext (name :: Symbol) (subContext :: [*]) subApi #
WithNamedContext names a specific tagged context to use for the
combinators in the API. (See also in servant-server,
Servant.Server.Context.) For example:
type UseNamedContextAPI = WithNamedContext "myContext" '[String] (
ReqBody '[JSON] Int :> Get '[JSON] Int)Both the ReqBody and Get combinators will use the WithNamedContext with
type tag "myContext" as their context.
Contexts are only relevant for servant-server.
For more information, see the tutorial.
Instances
| HasLink sub => HasLink (WithNamedContext name context sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (WithNamedContext name context sub) a :: Type # Methods toLink :: (Link -> a) -> Proxy (WithNamedContext name context sub) -> Link -> MkLink (WithNamedContext name context sub) a # | |
| type MkLink (WithNamedContext name context sub :: Type) a # | |
Defined in Servant.Links | |
Access context entries in combinators in servant-server
Actual endpoints, distinguished by HTTP method
HTTP standard method (as defined by RFC 2616, and PATCH which is defined by RFC 5789).
Instances
class ReflectMethod a where #
Methods
reflectMethod :: Proxy a -> Method #
Instances
| ReflectMethod PATCH # | |
Defined in Servant.API.Verbs Methods reflectMethod :: Proxy PATCH -> Method # | |
| ReflectMethod OPTIONS # | |
Defined in Servant.API.Verbs Methods reflectMethod :: Proxy OPTIONS -> Method # | |
| ReflectMethod CONNECT # | |
Defined in Servant.API.Verbs Methods reflectMethod :: Proxy CONNECT -> Method # | |
| ReflectMethod TRACE # | |
Defined in Servant.API.Verbs Methods reflectMethod :: Proxy TRACE -> Method # | |
| ReflectMethod DELETE # | |
Defined in Servant.API.Verbs Methods reflectMethod :: Proxy DELETE -> Method # | |
| ReflectMethod PUT # | |
Defined in Servant.API.Verbs Methods reflectMethod :: Proxy PUT -> Method # | |
| ReflectMethod HEAD # | |
Defined in Servant.API.Verbs Methods reflectMethod :: Proxy HEAD -> Method # | |
| ReflectMethod POST # | |
Defined in Servant.API.Verbs Methods reflectMethod :: Proxy POST -> Method # | |
| ReflectMethod GET # | |
Defined in Servant.API.Verbs Methods reflectMethod :: Proxy GET -> Method # | |
type GetPartialContent = Verb GET 206 #
GET with 206 status code.
type PostResetContent = Verb POST 205 #
POST with 205 status code.
type GetResetContent = Verb GET 205 #
GET with 205 status code.
type PutNoContent = Verb PUT 204 #
PUT with 204 status code.
type PatchNoContent = Verb PATCH 204 #
PATCH with 204 status code.
type DeleteNoContent = Verb DELETE 204 #
DELETE with 204 status code.
type PostNoContent = Verb POST 204 #
POST with 204 status code.
type GetNoContent = Verb GET 204 #
GET with 204 status code.
type PutNonAuthoritative = Verb PUT 203 #
PUT with 203 status code.
type PatchNonAuthoritative = Verb PATCH 203 #
PATCH with 203 status code.
type DeleteNonAuthoritative = Verb DELETE 203 #
DELETE with 203 status code.
type PostNonAuthoritative = Verb POST 203 #
POST with 203 status code.
type GetNonAuthoritative = Verb GET 203 #
GET with 203 status code.
type PutAccepted = Verb PUT 202 #
PUT with 202 status code.
type PatchAccepted = Verb PATCH 202 #
PATCH with 202 status code.
type DeleteAccepted = Verb DELETE 202 #
DELETE with 202 status code.
type PostAccepted = Verb POST 202 #
POST with 202 status code.
type GetAccepted = Verb GET 202 #
GET with 202 status code.
type PutCreated = Verb PUT 201 #
PUT with 201 status code.
type PostCreated = Verb POST 201 #
POST with 201 status code.
data Verb (method :: k1) (statusCode :: Nat) (contentTypes :: [*]) (a :: *) #
Verb is a general type for representing HTTP verbs (a.k.a. methods). For
convenience, type synonyms for each verb with a 200 response code are
provided, but you are free to define your own:
>>>type Post204 contentTypes a = Verb 'POST 204 contentTypes a
Streaming endpoints, distinguished by HTTP method
data NetstringFraming #
The netstring framing strategy as defined by djb: http://cr.yp.to/proto/netstrings.txt
Any string of 8-bit bytes may be encoded as [len]":"[string]",". Here
[string] is the string and [len] is a nonempty sequence of ASCII digits
giving the length of [string] in decimal. The ASCII digits are 30 for
0, 31 for 1, and so on up through 39 for 9. Extra zeros at the front
of [len] are prohibited: [len] begins with 30 exactly when
[string] is empty.
For example, the string "hello world!" is encoded as
32 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 2c,
i.e., "12:hello world!,".
The empty string is encoded as "0:,".
Instances
| FramingUnrender NetstringFraming # | |
Defined in Servant.API.Stream Methods framingUnrender :: Monad m => Proxy NetstringFraming -> (ByteString -> Either String a) -> SourceT m ByteString -> SourceT m a # | |
| FramingRender NetstringFraming # | |
Defined in Servant.API.Stream Methods framingRender :: Monad m => Proxy NetstringFraming -> (a -> ByteString) -> SourceT m a -> SourceT m ByteString # | |
data NewlineFraming #
A simple framing strategy that has no header, and inserts a newline character after each frame. This assumes that it is used with a Content-Type that encodes without newlines (e.g. JSON).
Instances
| FramingUnrender NewlineFraming # | |
Defined in Servant.API.Stream Methods framingUnrender :: Monad m => Proxy NewlineFraming -> (ByteString -> Either String a) -> SourceT m ByteString -> SourceT m a # | |
| FramingRender NewlineFraming # | |
Defined in Servant.API.Stream Methods framingRender :: Monad m => Proxy NewlineFraming -> (a -> ByteString) -> SourceT m a -> SourceT m ByteString # | |
A framing strategy that does not do any framing at all, it just passes the input data This will be used most of the time with binary data, such as files
Instances
| FramingUnrender NoFraming # | As That works well when |
Defined in Servant.API.Stream Methods framingUnrender :: Monad m => Proxy NoFraming -> (ByteString -> Either String a) -> SourceT m ByteString -> SourceT m a # | |
| FramingRender NoFraming # | |
Defined in Servant.API.Stream Methods framingRender :: Monad m => Proxy NoFraming -> (a -> ByteString) -> SourceT m a -> SourceT m ByteString # | |
class FramingUnrender strategy where #
The FramingUnrender class provides the logic for parsing a framing
strategy.
Methods
framingUnrender :: Monad m => Proxy strategy -> (ByteString -> Either String a) -> SourceT m ByteString -> SourceT m a #
Instances
| FramingUnrender NetstringFraming # | |
Defined in Servant.API.Stream Methods framingUnrender :: Monad m => Proxy NetstringFraming -> (ByteString -> Either String a) -> SourceT m ByteString -> SourceT m a # | |
| FramingUnrender NewlineFraming # | |
Defined in Servant.API.Stream Methods framingUnrender :: Monad m => Proxy NewlineFraming -> (ByteString -> Either String a) -> SourceT m ByteString -> SourceT m a # | |
| FramingUnrender NoFraming # | As That works well when |
Defined in Servant.API.Stream Methods framingUnrender :: Monad m => Proxy NoFraming -> (ByteString -> Either String a) -> SourceT m ByteString -> SourceT m a # | |
class FramingRender strategy where #
The FramingRender class provides the logic for emitting a framing strategy.
The strategy transforms a into SourceT m a,
therefore it can prepend, append and intercalate framing structure
around chunks.SourceT m ByteString
Note: as the is generic, this is pure transformation.Monad m
Methods
framingRender :: Monad m => Proxy strategy -> (a -> ByteString) -> SourceT m a -> SourceT m ByteString #
Instances
| FramingRender NetstringFraming # | |
Defined in Servant.API.Stream Methods framingRender :: Monad m => Proxy NetstringFraming -> (a -> ByteString) -> SourceT m a -> SourceT m ByteString # | |
| FramingRender NewlineFraming # | |
Defined in Servant.API.Stream Methods framingRender :: Monad m => Proxy NewlineFraming -> (a -> ByteString) -> SourceT m a -> SourceT m ByteString # | |
| FramingRender NoFraming # | |
Defined in Servant.API.Stream Methods framingRender :: Monad m => Proxy NoFraming -> (a -> ByteString) -> SourceT m a -> SourceT m ByteString # | |
class FromSourceIO chunk a | a -> chunk where #
FromSourceIO is intended to be implemented for types such as Conduit,
Pipe, etc. By implementing this class, all such streaming abstractions can
be used directly on the client side for talking to streaming endpoints.
Methods
fromSourceIO :: SourceIO chunk -> a #
Instances
| MonadIO m => FromSourceIO a (SourceT m a) # | |
Defined in Servant.API.Stream Methods fromSourceIO :: SourceIO a -> SourceT m a # | |
class ToSourceIO chunk a | a -> chunk where #
ToSourceIO is intended to be implemented for types such as Conduit, Pipe,
etc. By implementing this class, all such streaming abstractions can be used
directly as endpoints.
Methods
toSourceIO :: a -> SourceIO chunk #
Instances
| ToSourceIO a [a] # | |
Defined in Servant.API.Stream Methods toSourceIO :: [a] -> SourceIO a # | |
| ToSourceIO a (NonEmpty a) # | |
Defined in Servant.API.Stream Methods toSourceIO :: NonEmpty a -> SourceIO a # | |
| SourceToSourceIO m => ToSourceIO chunk (SourceT m chunk) # | Relax to use auxiliary class, have m |
Defined in Servant.API.Stream Methods toSourceIO :: SourceT m chunk -> SourceIO chunk # | |
data StreamBody' (mods :: [*]) (framing :: *) (contentType :: *) (a :: *) #
Instances
| HasLink sub => HasLink (StreamBody' mods framing ct a :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (StreamBody' mods framing ct a :> sub) a :: Type # Methods toLink :: (Link -> a0) -> Proxy (StreamBody' mods framing ct a :> sub) -> Link -> MkLink (StreamBody' mods framing ct a :> sub) a0 # | |
| Generic (StreamBody' mods framing contentType a) # | |
Defined in Servant.API.Stream Associated Types type Rep (StreamBody' mods framing contentType a) :: Type -> Type # Methods from :: StreamBody' mods framing contentType a -> Rep (StreamBody' mods framing contentType a) x # to :: Rep (StreamBody' mods framing contentType a) x -> StreamBody' mods framing contentType a # | |
| type MkLink (StreamBody' mods framing ct a :> sub :: Type) r # | |
Defined in Servant.Links | |
| type Rep (StreamBody' mods framing contentType a) # | |
Defined in Servant.API.Stream | |
type StreamBody = StreamBody' '[] #
A stream request body.
type StreamPost = Stream POST 200 #
data Stream (method :: k1) (status :: Nat) (framing :: *) (contentType :: *) (a :: *) #
A Stream endpoint for a given method emits a stream of encoded values at a
given Content-Type, delimited by a framing strategy.
Type synonyms are provided for standard methods.
Authentication
data BasicAuthData #
A simple datatype to hold data required to decorate a request
Constructors
| BasicAuthData | |
Fields | |
data BasicAuth (realm :: Symbol) (userData :: *) #
Combinator for Basic Access Authentication.
- IMPORTANT*: Only use Basic Auth over HTTPS! Credentials are not hashed or encrypted. Note also that because the same credentials are sent on every request, Basic Auth is not as secure as some alternatives. Further, the implementation in servant-server does not protect against some types of timing attacks.
In Basic Auth, username and password are base64-encoded and transmitted via
the Authorization header. Handshakes are not required, making it
relatively efficient.
Endpoints description
data Description (sym :: Symbol) #
Add more verbose description for (part of) API.
Example:
>>>:{type MyApi = Description "This comment is visible in multiple Servant interpretations \ \and can be really long if necessary. \ \Haskell multiline support is not perfect \ \but it's still very readable." :> Get '[JSON] Book :}
Instances
| HasLink sub => HasLink (Description s :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (Description s :> sub) a :: Type # Methods toLink :: (Link -> a) -> Proxy (Description s :> sub) -> Link -> MkLink (Description s :> sub) a # | |
| type MkLink (Description s :> sub :: Type) a # | |
Defined in Servant.Links | |
data Summary (sym :: Symbol) #
Add a short summary for (part of) API.
Example:
>>>type MyApi = Summary "Get book by ISBN." :> "books" :> Capture "isbn" Text :> Get '[JSON] Book
Content Types
A type for responses without content-body.
Constructors
| NoContent |
Instances
| Eq NoContent # | |
| Read NoContent # | |
| Show NoContent # | |
| Generic NoContent # | |
| AllMime (ctyp ': (ctyp' ': ctyps)) => AllMimeRender (ctyp ': (ctyp' ': ctyps)) NoContent # | |
Defined in Servant.API.ContentTypes Methods allMimeRender :: Proxy (ctyp ': (ctyp' ': ctyps)) -> NoContent -> [(MediaType, ByteString)] # | |
| Accept ctyp => AllMimeRender (ctyp ': ([] :: [Type])) NoContent # | |
Defined in Servant.API.ContentTypes Methods allMimeRender :: Proxy (ctyp ': []) -> NoContent -> [(MediaType, ByteString)] # | |
| type Rep NoContent # | |
class Accept ctype => MimeUnrender ctype a where #
Instantiate this class to register a way of deserializing a type based
on the request's Content-Type header.
>>>import Network.HTTP.Media hiding (Accept)>>>import qualified Data.ByteString.Lazy.Char8 as BSC>>>data MyContentType = MyContentType String
>>>:{instance Accept MyContentType where contentType _ = "example" // "prs.me.mine" /: ("charset", "utf-8") :}
>>>:{instance Read a => MimeUnrender MyContentType a where mimeUnrender _ bs = case BSC.take 12 bs of "MyContentType" -> return . read . BSC.unpack $ BSC.drop 12 bs _ -> Left "didn't start with the magic incantation" :}
>>>type MyAPI = "path" :> ReqBody '[MyContentType] Int :> Get '[JSON] Int
Minimal complete definition
Methods
mimeUnrender :: Proxy ctype -> ByteString -> Either String a #
mimeUnrenderWithType :: Proxy ctype -> MediaType -> ByteString -> Either String a #
Instances
class Accept ctype => MimeRender ctype a where #
Instantiate this class to register a way of serializing a type based
on the Accept header.
Example:
data MyContentType
instance Accept MyContentType where
contentType _ = "example" // "prs.me.mine" /: ("charset", "utf-8")
instance Show a => MimeRender MyContentType a where
mimeRender _ val = pack ("This is MINE! " ++ show val)
type MyAPI = "path" :> Get '[MyContentType] IntMethods
mimeRender :: Proxy ctype -> a -> ByteString #
Instances
Instances of Accept represent mimetypes. They are used for matching
against the Accept HTTP header of the request, and for setting the
Content-Type header of the response
Example:
>>>import Network.HTTP.Media ((//), (/:))>>>data HTML>>>:{instance Accept HTML where contentType _ = "text" // "html" /: ("charset", "utf-8") :}
Minimal complete definition
Instances
| Accept OctetStream # | application/octet-stream |
Defined in Servant.API.ContentTypes Methods contentType :: Proxy OctetStream -> MediaType # | |
| Accept FormUrlEncoded # | application/x-www-form-urlencoded |
Defined in Servant.API.ContentTypes Methods contentType :: Proxy FormUrlEncoded -> MediaType # contentTypes :: Proxy FormUrlEncoded -> NonEmpty MediaType # | |
| Accept PlainText # | text/plain;charset=utf-8 |
Defined in Servant.API.ContentTypes | |
| Accept JSON # | application/json |
Defined in Servant.API.ContentTypes | |
data OctetStream #
Instances
| Accept OctetStream # | application/octet-stream |
Defined in Servant.API.ContentTypes Methods contentType :: Proxy OctetStream -> MediaType # | |
| MimeUnrender OctetStream ByteString # | Right . toStrict |
Defined in Servant.API.ContentTypes Methods mimeUnrender :: Proxy OctetStream -> ByteString0 -> Either String ByteString # mimeUnrenderWithType :: Proxy OctetStream -> MediaType -> ByteString0 -> Either String ByteString # | |
| MimeUnrender OctetStream ByteString # | Right . id |
Defined in Servant.API.ContentTypes Methods mimeUnrender :: Proxy OctetStream -> ByteString -> Either String ByteString # mimeUnrenderWithType :: Proxy OctetStream -> MediaType -> ByteString -> Either String ByteString # | |
| MimeRender OctetStream ByteString # | |
Defined in Servant.API.ContentTypes Methods mimeRender :: Proxy OctetStream -> ByteString -> ByteString0 # | |
| MimeRender OctetStream ByteString # | id |
Defined in Servant.API.ContentTypes Methods mimeRender :: Proxy OctetStream -> ByteString -> ByteString # | |
data FormUrlEncoded #
Instances
| Accept FormUrlEncoded # | application/x-www-form-urlencoded |
Defined in Servant.API.ContentTypes Methods contentType :: Proxy FormUrlEncoded -> MediaType # contentTypes :: Proxy FormUrlEncoded -> NonEmpty MediaType # | |
| FromForm a => MimeUnrender FormUrlEncoded a # |
|
Defined in Servant.API.ContentTypes Methods mimeUnrender :: Proxy FormUrlEncoded -> ByteString -> Either String a # mimeUnrenderWithType :: Proxy FormUrlEncoded -> MediaType -> ByteString -> Either String a # | |
| ToForm a => MimeRender FormUrlEncoded a # |
|
Defined in Servant.API.ContentTypes Methods mimeRender :: Proxy FormUrlEncoded -> a -> ByteString # | |
Instances
Instances
| Accept JSON # | application/json |
Defined in Servant.API.ContentTypes | |
| FromJSON a => MimeUnrender JSON a # |
|
Defined in Servant.API.ContentTypes Methods mimeUnrender :: Proxy JSON -> ByteString -> Either String a # mimeUnrenderWithType :: Proxy JSON -> MediaType -> ByteString -> Either String a # | |
| ToJSON a => MimeRender JSON a # | |
Defined in Servant.API.ContentTypes Methods mimeRender :: Proxy JSON -> a -> ByteString # | |
Serializing and deserializing types based on Accept and
Content-Type headers.
Response Headers
class HasResponseHeader h a headers #
Minimal complete definition
hlistLookupHeader
Instances
| HasResponseHeader h a rest => HasResponseHeader h a (first ': rest) # | |
Defined in Servant.API.ResponseHeaders Methods hlistLookupHeader :: HList (first ': rest) -> ResponseHeader h a | |
| HasResponseHeader h a (Header h a ': rest) # | |
Defined in Servant.API.ResponseHeaders Methods hlistLookupHeader :: HList (Header h a ': rest) -> ResponseHeader h a | |
class AddHeader h v orig new | h v orig -> new, new -> h, new -> v, new -> orig #
Minimal complete definition
addOptionalHeader
Instances
| (KnownSymbol h, ToHttpApiData v, new ~ Headers (Header h v ': ([] :: [Type])) a) => AddHeader h v a new # | |
Defined in Servant.API.ResponseHeaders Methods addOptionalHeader :: ResponseHeader h v -> a -> new | |
| (KnownSymbol h, ToHttpApiData v) => AddHeader h v (Headers (fst ': rest) a) (Headers (Header h v ': (fst ': rest)) a) # | |
Defined in Servant.API.ResponseHeaders Methods addOptionalHeader :: ResponseHeader h v -> Headers (fst ': rest) a -> Headers (Header h v ': (fst ': rest)) a | |
class GetHeaders ls where #
Methods
getHeaders :: ls -> [Header] #
Instances
| GetHeadersFromHList hs => GetHeaders (HList hs) # | |
Defined in Servant.API.ResponseHeaders Methods getHeaders :: HList hs -> [Header] # | |
| GetHeaders' hs => GetHeaders (Headers hs a) # | |
Defined in Servant.API.ResponseHeaders Methods getHeaders :: Headers hs a -> [Header] # | |
class BuildHeadersTo hs where #
Methods
buildHeadersTo :: [Header] -> HList hs #
Note: if there are multiple occurences of a header in the argument, the values are interspersed with commas before deserialization (see RFC2616 Sec 4.2)
Instances
| BuildHeadersTo ([] :: [Type]) # | |
Defined in Servant.API.ResponseHeaders Methods buildHeadersTo :: [Header] -> HList [] # | |
| (FromHttpApiData v, BuildHeadersTo xs, KnownSymbol h) => BuildHeadersTo (Header h v ': xs) # | |
Defined in Servant.API.ResponseHeaders Methods buildHeadersTo :: [Header0] -> HList (Header h v ': xs) # | |
Instances
| GetHeadersFromHList hs => GetHeaders (HList hs) # | |
Defined in Servant.API.ResponseHeaders Methods getHeaders :: HList hs -> [Header] # | |
data ResponseHeader (sym :: Symbol) a #
Constructors
| Header a | |
| MissingHeader | |
| UndecodableHeader ByteString |
Instances
| Functor (ResponseHeader sym) # | |
Defined in Servant.API.ResponseHeaders Methods fmap :: (a -> b) -> ResponseHeader sym a -> ResponseHeader sym b # (<$) :: a -> ResponseHeader sym b -> ResponseHeader sym a # | |
| Eq a => Eq (ResponseHeader sym a) # | |
Defined in Servant.API.ResponseHeaders Methods (==) :: ResponseHeader sym a -> ResponseHeader sym a -> Bool # (/=) :: ResponseHeader sym a -> ResponseHeader sym a -> Bool # | |
| Show a => Show (ResponseHeader sym a) # | |
Defined in Servant.API.ResponseHeaders Methods showsPrec :: Int -> ResponseHeader sym a -> ShowS # show :: ResponseHeader sym a -> String # showList :: [ResponseHeader sym a] -> ShowS # | |
Response Header objects. You should never need to construct one directly.
Instead, use addOptionalHeader.
Constructors
| Headers | |
Fields
| |
Instances
| (KnownSymbol h, ToHttpApiData v) => AddHeader h v (Headers (fst ': rest) a) (Headers (Header h v ': (fst ': rest)) a) # | |
Defined in Servant.API.ResponseHeaders Methods addOptionalHeader :: ResponseHeader h v -> Headers (fst ': rest) a -> Headers (Header h v ': (fst ': rest)) a | |
| Functor (Headers ls) # | |
| GetHeaders' hs => GetHeaders (Headers hs a) # | |
Defined in Servant.API.ResponseHeaders Methods getHeaders :: Headers hs a -> [Header] # | |
addHeader :: AddHeader h v orig new => v -> orig -> new #
addHeader adds a header to a response. Note that it changes the type of
the value in the following ways:
- A simple value is wrapped in "Headers '[hdr]":
>>>let example1 = addHeader 5 "hi" :: Headers '[Header "someheader" Int] String;>>>getHeaders example1[("someheader","5")]
- A value that already has a header has its new header *prepended* to the existing list:
>>>let example1 = addHeader 5 "hi" :: Headers '[Header "someheader" Int] String;>>>let example2 = addHeader True example1 :: Headers '[Header "1st" Bool, Header "someheader" Int] String>>>getHeaders example2[("1st","true"),("someheader","5")]
Note that while in your handlers type annotations are not required, since the type can be inferred from the API type, in other cases you may find yourself needing to add annotations.
noHeader :: AddHeader h v orig new => orig -> new #
Deliberately do not add a header to a value.
>>>let example1 = noHeader "hi" :: Headers '[Header "someheader" Int] String>>>getHeaders example1[]
lookupResponseHeader :: HasResponseHeader h a headers => Headers headers r -> ResponseHeader h a #
Look up a specific ResponseHeader, without having to know what position it is in the HList.
>>>let example1 = addHeader 5 "hi" :: Headers '[Header "someheader" Int] String>>>let example2 = addHeader True example1 :: Headers '[Header "1st" Bool, Header "someheader" Int] String>>>lookupResponseHeader example2 :: ResponseHeader "someheader" IntHeader 5
>>>lookupResponseHeader example2 :: ResponseHeader "1st" BoolHeader True
Usage of this function relies on an explicit type annotation of the header to be looked up. This can be done with type annotations on the result, or with an explicit type application. In this example, the type of header value is determined by the type-inference, we only specify the name of the header:
>>>:set -XTypeApplications>>>case lookupResponseHeader @"1st" example2 of { Header b -> b ; _ -> False }True
Since: 0.15
Untyped endpoints
Endpoint for plugging in your own Wai Applications.
The given Application will get the request as received by the server, potentially with
a modified (stripped) pathInfo if the Application is being routed with :>.
In addition to just letting you plug in your existing WAI Applications,
this can also be used with serveDirectory to serve
static files stored in a particular directory on your filesystem
Plugging in a wai Application, serving directories
FromHttpApiData and ToHttpApiData
class ToHttpApiData a where #
Convert value to HTTP API data.
WARNING: Do not derive this using DeriveAnyClass as the generated
instance will loop indefinitely.
Minimal complete definition
Methods
toUrlPiece :: a -> Text #
Convert to URL path piece.
toEncodedUrlPiece :: a -> Builder #
Convert to a URL path piece, making sure to encode any special chars.
The default definition uses encodePathSegmentsRelative,
but this may be overriden with a more efficient version.
toHeader :: a -> ByteString #
Convert to HTTP header value.
toQueryParam :: a -> Text #
Convert to query param value.
Instances
class FromHttpApiData a where #
Parse value from HTTP API data.
WARNING: Do not derive this using DeriveAnyClass as the generated
instance will loop indefinitely.
Minimal complete definition
Methods
parseUrlPiece :: Text -> Either Text a #
Parse URL path piece.
parseHeader :: ByteString -> Either Text a #
Parse HTTP header value.
parseQueryParam :: Text -> Either Text a #
Parse query param value.
Instances
Classes and instances for types that can be converted to and from HTTP API data.
Experimental modules
data AuthProtect (tag :: k) #
A generalized Authentication combinator. Use this if you have a non-standard authentication technique.
NOTE: THIS API IS EXPERIMENTAL AND SUBJECT TO CHANGE.
Instances
| HasLink sub => HasLink (AuthProtect tag :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (AuthProtect tag :> sub) a :: Type # Methods toLink :: (Link -> a) -> Proxy (AuthProtect tag :> sub) -> Link -> MkLink (AuthProtect tag :> sub) a # | |
| type MkLink (AuthProtect tag :> sub :: Type) a # | |
Defined in Servant.Links | |
General Authentication
Links
Represents a general universal resource identifier using its component parts.
For example, for the URI
foo://anonymous@www.haskell.org:42/ghc?query#frag
the components are:
Constructors
| URI | |
Instances
| Eq URI | |
| Data URI | |
Defined in Network.URI Methods gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> URI -> c URI # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c URI # dataTypeOf :: URI -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c URI) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c URI) # gmapT :: (forall b. Data b => b -> b) -> URI -> URI # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> URI -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> URI -> r # gmapQ :: (forall d. Data d => d -> u) -> URI -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> URI -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> URI -> m URI # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> URI -> m URI # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> URI -> m URI # | |
| Ord URI | |
| Show URI | |
| Generic URI | |
| NFData URI | |
Defined in Network.URI | |
| type Rep URI | |
Defined in Network.URI type Rep URI = D1 (MetaData "URI" "Network.URI" "network-uri-2.6.1.0-K75fCYvLQE41EntOQ30cqK" False) (C1 (MetaCons "URI" PrefixI True) ((S1 (MetaSel (Just "uriScheme") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 String) :*: S1 (MetaSel (Just "uriAuthority") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (Maybe URIAuth))) :*: (S1 (MetaSel (Just "uriPath") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 String) :*: (S1 (MetaSel (Just "uriQuery") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 String) :*: S1 (MetaSel (Just "uriFragment") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 String))))) | |
type family IsElem endpoint api :: Constraint where ... #
Closed type family, check if endpoint is within api.
Uses if it exhausts all other options.IsElem'
>>>ok (Proxy :: Proxy (IsElem ("hello" :> Get '[JSON] Int) SampleAPI))OK
>>>ok (Proxy :: Proxy (IsElem ("bye" :> Get '[JSON] Int) SampleAPI))... ... Could not deduce... ...
An endpoint is considered within an api even if it is missing combinators that don't affect the URL:
>>>ok (Proxy :: Proxy (IsElem (Get '[JSON] Int) (Header "h" Bool :> Get '[JSON] Int)))OK
>>>ok (Proxy :: Proxy (IsElem (Get '[JSON] Int) (ReqBody '[JSON] Bool :> Get '[JSON] Int)))OK
- N.B.:*
IsElem a bcan be seen as capturing the notion of whether the URL represented byawould match the URL represented byb, *not* whether a request represented byamatches the endpoints servingb(for the latter, useIsIn).
Equations
| IsElem e (sa :<|> sb) = Or (IsElem e sa) (IsElem e sb) | |
| IsElem (e :> sa) (e :> sb) = IsElem sa sb | |
| IsElem sa (Header sym x :> sb) = IsElem sa sb | |
| IsElem sa (ReqBody y x :> sb) = IsElem sa sb | |
| IsElem (CaptureAll z y :> sa) (CaptureAll x y :> sb) = IsElem sa sb | |
| IsElem (Capture z y :> sa) (Capture x y :> sb) = IsElem sa sb | |
| IsElem sa (QueryParam x y :> sb) = IsElem sa sb | |
| IsElem sa (QueryParams x y :> sb) = IsElem sa sb | |
| IsElem sa (QueryFlag x :> sb) = IsElem sa sb | |
| IsElem (Verb m s ct typ) (Verb m s ct' typ) = IsSubList ct ct' | |
| IsElem e e = () | |
| IsElem e a = IsElem' e a |
type family IsElem' a s :: Constraint #
You may use this type family to tell the type checker that your custom
type may be skipped as part of a link. This is useful for things like
that are optional in a URI and do not affect them if they are
omitted.QueryParam
>>>data CustomThing>>>type instance IsElem' e (CustomThing :> s) = IsElem e s
Note that is called, which will mutually recurse back to IsElem
if it exhausts all other options again.IsElem'
Once you have written a HasLink instance for CustomThing you are ready to go.
class HasLink endpoint where #
Construct a toLink for an endpoint.
Methods
Instances
| HasLink EmptyAPI # | |
| HasLink Raw # | |
| (HasLink a, HasLink b) => HasLink (a :<|> b :: Type) # | |
| HasLink sub => HasLink (HttpVersion :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (HttpVersion :> sub) a :: Type # Methods toLink :: (Link -> a) -> Proxy (HttpVersion :> sub) -> Link -> MkLink (HttpVersion :> sub) a # | |
| HasLink sub => HasLink (Vault :> sub :: Type) # | |
| HasLink sub => HasLink (BasicAuth realm a :> sub :: Type) # | |
| (ToHttpApiData v, HasLink sub) => HasLink (CaptureAll sym v :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (CaptureAll sym v :> sub) a :: Type # Methods toLink :: (Link -> a) -> Proxy (CaptureAll sym v :> sub) -> Link -> MkLink (CaptureAll sym v :> sub) a # | |
| (ToHttpApiData v, HasLink sub) => HasLink (Capture' mods sym v :> sub :: Type) # | |
| HasLink sub => HasLink (Description s :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (Description s :> sub) a :: Type # Methods toLink :: (Link -> a) -> Proxy (Description s :> sub) -> Link -> MkLink (Description s :> sub) a # | |
| HasLink sub => HasLink (Summary s :> sub :: Type) # | |
| HasLink sub => HasLink (AuthProtect tag :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (AuthProtect tag :> sub) a :: Type # Methods toLink :: (Link -> a) -> Proxy (AuthProtect tag :> sub) -> Link -> MkLink (AuthProtect tag :> sub) a # | |
| HasLink sub => HasLink (IsSecure :> sub :: Type) # | |
| HasLink sub => HasLink (Header' mods sym a :> sub :: Type) # | |
| (KnownSymbol sym, HasLink sub) => HasLink (QueryFlag sym :> sub :: Type) # | |
| (KnownSymbol sym, ToHttpApiData v, HasLink sub) => HasLink (QueryParams sym v :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (QueryParams sym v :> sub) a :: Type # Methods toLink :: (Link -> a) -> Proxy (QueryParams sym v :> sub) -> Link -> MkLink (QueryParams sym v :> sub) a # | |
| (KnownSymbol sym, ToHttpApiData v, HasLink sub, SBoolI (FoldRequired mods)) => HasLink (QueryParam' mods sym v :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (QueryParam' mods sym v :> sub) a :: Type # Methods toLink :: (Link -> a) -> Proxy (QueryParam' mods sym v :> sub) -> Link -> MkLink (QueryParam' mods sym v :> sub) a # | |
| HasLink sub => HasLink (RemoteHost :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (RemoteHost :> sub) a :: Type # Methods toLink :: (Link -> a) -> Proxy (RemoteHost :> sub) -> Link -> MkLink (RemoteHost :> sub) a # | |
| HasLink sub => HasLink (ReqBody' mods ct a :> sub :: Type) # | |
| HasLink sub => HasLink (StreamBody' mods framing ct a :> sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (StreamBody' mods framing ct a :> sub) a :: Type # Methods toLink :: (Link -> a0) -> Proxy (StreamBody' mods framing ct a :> sub) -> Link -> MkLink (StreamBody' mods framing ct a :> sub) a0 # | |
| (KnownSymbol sym, HasLink sub) => HasLink (sym :> sub :: Type) # | |
| HasLink sub => HasLink (WithNamedContext name context sub :: Type) # | |
Defined in Servant.Links Associated Types type MkLink (WithNamedContext name context sub) a :: Type # Methods toLink :: (Link -> a) -> Proxy (WithNamedContext name context sub) -> Link -> MkLink (WithNamedContext name context sub) a # | |
| HasLink (Verb m s ct a :: Type) # | |
| HasLink (Stream m status fr ct a :: Type) # | |
A safe link datatype.
The only way of constructing a Link is using safeLink, which means any
Link is guaranteed to be part of the mentioned API.
Instances
| Show Link # | |
| ToHttpApiData Link # | |
Defined in Servant.Links Methods toUrlPiece :: Link -> Text # toEncodedUrlPiece :: Link -> Builder # toHeader :: Link -> ByteString # toQueryParam :: Link -> Text # | |
Arguments
| :: (IsElem endpoint api, HasLink endpoint) | |
| => Proxy api | The whole API that this endpoint is a part of |
| -> Proxy endpoint | The API endpoint you would like to point to |
| -> MkLink endpoint Link |
Create a valid (by construction) relative URI with query params.
This function will only typecheck if endpoint is part of the API api
Type-safe internal URIs
Re-exports
type family If (cond :: Bool) (tru :: k) (fls :: k) :: k where ... #
Type-level If. If True a b ==> a; If False a b ==> b