servant-0.12: A family of combinators for defining webservices APIs

Safe HaskellNone
LanguageHaskell2010

Servant.API.ResponseHeaders

Description

This module provides facilities for adding headers to a response.

>>> let headerVal = addHeader "some-url" 5 :: Headers '[Header "Location" String] Int

The value is added to the header specified by the type (Location in the example above).

Synopsis

Documentation

data Headers ls a #

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) # 

Methods

addOptionalHeader :: Header h v -> Headers ((* ': fst) rest) a -> Headers ((* ': Header h v) ((* ': fst) rest)) a

Functor (Headers ls) # 

Methods

fmap :: (a -> b) -> Headers ls a -> Headers ls b #

(<$) :: a -> Headers ls b -> Headers ls a #

(KnownSymbol h, GetHeaders (HList rest), ToHttpApiData v) => GetHeaders (Headers ((:) * (Header h v) rest) a) # 

Methods

getHeaders :: Headers ((* ': Header h v) rest) a -> [Header] #

GetHeaders (Headers ([] *) a) # 

Methods

getHeaders :: Headers [*] a -> [Header] #

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) ([] *)) a)) => AddHeader h v a new # 

Methods

addOptionalHeader :: Header h v -> a -> new

(KnownSymbol h, ToHttpApiData v) => AddHeader h v (Headers ((:) * fst rest) a) (Headers ((:) * (Header h v) ((:) * fst rest)) a) # 

Methods

addOptionalHeader :: Header h v -> Headers ((* ': fst) rest) a -> Headers ((* ': Header h v) ((* ': fst) rest)) a

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:

  1. A simple value is wrapped in "Headers '[hdr]":
>>> let example1 = addHeader 5 "hi" :: Headers '[Header "someheader" Int] String;
>>> getHeaders example1
[("someheader","5")]
  1. 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
[]

class BuildHeadersTo hs where #

Minimal complete definition

buildHeadersTo

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 ([] *) # 

Methods

buildHeadersTo :: [Header] -> HList [*] #

(FromHttpApiData v, BuildHeadersTo xs, KnownSymbol h) => BuildHeadersTo ((:) * (Header h v) xs) # 

Methods

buildHeadersTo :: [Header] -> HList ((* ': Header h v) xs) #

class GetHeaders ls where #

Minimal complete definition

getHeaders

Methods

getHeaders :: ls -> [Header] #

Instances

(KnownSymbol h, ToHttpApiData x, GetHeaders (HList xs)) => GetHeaders (HList ((:) * (Header h x) xs)) # 

Methods

getHeaders :: HList ((* ': Header h x) xs) -> [Header] #

GetHeaders (HList ([] *)) # 

Methods

getHeaders :: HList [*] -> [Header] #

(KnownSymbol h, GetHeaders (HList rest), ToHttpApiData v) => GetHeaders (Headers ((:) * (Header h v) rest) a) # 

Methods

getHeaders :: Headers ((* ': Header h v) rest) a -> [Header] #

GetHeaders (Headers ([] *) a) # 

Methods

getHeaders :: Headers [*] a -> [Header] #

type family HeaderValMap (f :: * -> *) (xs :: [*]) where ... #

Equations

HeaderValMap f '[] = '[] 
HeaderValMap f (Header h x ': xs) = Header h (f x) ': HeaderValMap f xs 

data HList a where #

Constructors

HNil :: HList '[] 
HCons :: Header h x -> HList xs -> HList (Header h x ': xs) 

Instances

(KnownSymbol h, ToHttpApiData x, GetHeaders (HList xs)) => GetHeaders (HList ((:) * (Header h x) xs)) # 

Methods

getHeaders :: HList ((* ': Header h x) xs) -> [Header] #

GetHeaders (HList ([] *)) # 

Methods

getHeaders :: HList [*] -> [Header] #