{- |Description: This module provides a way to get _all_ the headers
from a request, rather than asking for them piecemeal.
-}
module Servant.API.HeaderList where
import Network.Wai
import Servant
import Servant.Server.Internal.Delayed (passToServer)
import qualified Network.HTTP.Types.Header as NTH (Header)
{- |
The HeaderList combinator provides a list of
@Network.HTTP.Types.Header.Header@ values from the WAI request.
Example:
@
import Control.Monad.IO.Class (liftIO)
import Servant
import ServantExtras.HeaderList
import qualified Network.HTTP.Types.Header as NTH (Header)
type MyAPI = "my-header-endpoint"
:> HeaderList
:> Get '[JSON] NoContent
myServer :: Server MyAPI
myServer = headerEndpointHandler
where
headerEndpointHandler :: [NTH.Header] -> Handler NoContent
headerEndpointHandler headers =
let mCookieValue = lookup "merlinWasHere" headers in
case mCookieValue of
Nothing -> do
liftIO $ print "Merlin was *NOT* here!"
throwError err400 { errBody = "Clearly you've missed something." }
Just message -> do
liftIO $ do
print "Merlin WAS here, and he left us a message!"
print message
pure NoContent
@
-}
data HeaderList
instance HasServer api ctx => HasServer (HeaderList :> api) ctx where
type ServerT (HeaderList :> api) m = [NTH.Header] -> ServerT api m
hoistServerWithContext _ ctx nt server =
hoistServerWithContext (Proxy @api) ctx nt . server
route _ ctx server =
route (Proxy @api) ctx $
server `passToServer` \req ->
requestHeaders req