Safe Haskell | None |
---|---|
Language | Haskell2010 |
Traits and middlewares to handle request and response headers.
There are a number of ways to extract a header value from a request:
The header
middleware can extract a header value trait and invoke
another handler. An error handler is invoked if the header is missing
or the parsing fails.
The optionalHeader
middleware is similar but will not invoke the
error handling in case the header is missing. Instead, the trait
value will be set to Nothing
in that case.
The lenientHeader
middleware requires the header to be present. But
the trait attribute will be set to Left
msg
if an error occurs
while parsing it to a Haskell value. Here msg
will indicate the
error in parsing.
Finally, we have optionalLenientHeader
which combines the behaviors
of optionalHeader
and lenientHeader
. In this case, the header
extraction never fails. Missing headers and parse errors are
indicated in the trait attribute passed to next handler.
A response header can be set using setHeader
or setOptionalHeader
arrows. They accept a linked response and a header value and sets the
header in the response. You can generate an input response object
using functions from WebGear.Core.Trait.Status module.
Synopsis
- data Header (e :: Existence) (p :: ParseStyle) (name :: Symbol) (val :: Type) = Header
- data HeaderNotFound = HeaderNotFound
- newtype HeaderParseError = HeaderParseError Text
- type RequiredHeader = Header Required Strict
- type OptionalHeader = Header Optional Strict
- header :: forall name val h req. (Get h (Header Required Strict name val) Request, ArrowChoice h) => h (Linked req Request, Either HeaderNotFound HeaderParseError) Response -> Middleware h req (Header Required Strict name val ': req)
- optionalHeader :: forall name val h req. (Get h (Header Optional Strict name val) Request, ArrowChoice h) => h (Linked req Request, HeaderParseError) Response -> Middleware h req (Header Optional Strict name val ': req)
- lenientHeader :: forall name val h req. (Get h (Header Required Lenient name val) Request, ArrowChoice h) => h (Linked req Request, HeaderNotFound) Response -> Middleware h req (Header Required Lenient name val ': req)
- optionalLenientHeader :: forall name val h req. (Get h (Header Optional Lenient name val) Request, ArrowChoice h) => Middleware h req (Header Optional Lenient name val ': req)
- setHeader :: forall name val a h res. Set h (Header Required Strict name val) Response => h a (Linked res Response) -> h (val, a) (Linked (Header Required Strict name val ': res) Response)
- setOptionalHeader :: forall name val a h res. Set h (Header Optional Strict name val) Response => h a (Linked res Response) -> h (Maybe val, a) (Linked (Header Optional Strict name val ': res) Response)
Traits
data Header (e :: Existence) (p :: ParseStyle) (name :: Symbol) (val :: Type) Source #
A Trait
for capturing an HTTP header of specified name
and
converting it to some type val
. The modifiers e
and p
determine
how missing headers and parsing errors are handled. The header name
is compared case-insensitively.
Instances
data HeaderNotFound Source #
Indicates a missing header
Instances
Eq HeaderNotFound Source # | |
Defined in WebGear.Core.Trait.Header (==) :: HeaderNotFound -> HeaderNotFound -> Bool # (/=) :: HeaderNotFound -> HeaderNotFound -> Bool # | |
Read HeaderNotFound Source # | |
Defined in WebGear.Core.Trait.Header readsPrec :: Int -> ReadS HeaderNotFound # readList :: ReadS [HeaderNotFound] # | |
Show HeaderNotFound Source # | |
Defined in WebGear.Core.Trait.Header showsPrec :: Int -> HeaderNotFound -> ShowS # show :: HeaderNotFound -> String # showList :: [HeaderNotFound] -> ShowS # |
newtype HeaderParseError Source #
Error in converting a header
Instances
Eq HeaderParseError Source # | |
Defined in WebGear.Core.Trait.Header (==) :: HeaderParseError -> HeaderParseError -> Bool # (/=) :: HeaderParseError -> HeaderParseError -> Bool # | |
Read HeaderParseError Source # | |
Defined in WebGear.Core.Trait.Header | |
Show HeaderParseError Source # | |
Defined in WebGear.Core.Trait.Header showsPrec :: Int -> HeaderParseError -> ShowS # show :: HeaderParseError -> String # showList :: [HeaderParseError] -> ShowS # |
Middlewares
:: forall name val h req. (Get h (Header Required Strict name val) Request, ArrowChoice h) | |
=> h (Linked req Request, Either HeaderNotFound HeaderParseError) Response | Error handler |
-> Middleware h req (Header Required Strict name val ': req) |
Extract a header value and convert it to a value of type val
.
The associated trait attribute has type val
.
Example usage:
header @"Content-Length" @Integer errorHandler okHandler
:: forall name val h req. (Get h (Header Optional Strict name val) Request, ArrowChoice h) | |
=> h (Linked req Request, HeaderParseError) Response | Error handler |
-> Middleware h req (Header Optional Strict name val ': req) |
Extract an optional header value and convert it to a value of type
val
.
The associated trait attribute has type Maybe val
; a Nothing
value indicates that the header is missing from the request.
Example usage:
optionalHeader @"Content-Length" @Integer errorHandler okHandler
:: forall name val h req. (Get h (Header Required Lenient name val) Request, ArrowChoice h) | |
=> h (Linked req Request, HeaderNotFound) Response | Error handler |
-> Middleware h req (Header Required Lenient name val ': req) |
Extract a header value and convert it to a value of type val
.
The associated trait attribute has type Either Text val
. The
parsing is done leniently and any errors are reported in the trait
attribute.
Example usage:
lenientHeader @"Content-Length" @Integer errorHandler okHandler
optionalLenientHeader :: forall name val h req. (Get h (Header Optional Lenient name val) Request, ArrowChoice h) => Middleware h req (Header Optional Lenient name val ': req) Source #
Extract a header value and convert it to a value of type val
.
The associated trait attribute has type Maybe (Either Text
val)
. The parsing is done leniently. Any parsing errors and
missing header are reported in the trait attribute.
Example usage:
optionalLenientHeader @"Content-Length" @Integer handler
setHeader :: forall name val a h res. Set h (Header Required Strict name val) Response => h a (Linked res Response) -> h (val, a) (Linked (Header Required Strict name val ': res) Response) Source #
Set a header value in a response.
Example usage:
response' <- setHeader @"Content-Length" -< (response, 42)
setOptionalHeader :: forall name val a h res. Set h (Header Optional Strict name val) Response => h a (Linked res Response) -> h (Maybe val, a) (Linked (Header Optional Strict name val ': res) Response) Source #
Set an optional header value in a response.
Setting the header to Nothing
will remove it from the response if
it was previously set. The header will be considered as optional in
all relevant places (such as documentation).
Example usage:
response' <- setOptionalHeader @"Content-Length" -< (response, Just 42)