packages feed

servant-combinators-0.0.1: lib/Servant/API/RawRequest.hs

{- |Description: Provide a combinator to give handlers access to the
 raw WAI request.
-}
module Servant.API.RawRequest where

import Network.Wai
import Servant
import Servant.Server.Internal.Delayed (passToServer)

{- |
  @RawRequest@ provides the `Network.Wai.Request` field from the WAI request.

  Example:

@
import Control.Monad.IO.Class (liftIO)
import Network.Wai
import Servant
import ServantExtras.RawRequest

type MyAPI = "my-request-endpoint"
           :> RawRequest
           :> Get '[JSON] NoContent

myServer :: Server MyAPI
myServer = requestEndpointHandler
  where
    requestEndpointHandler :: Request -> Handler NoContent
    requestEndpointHandler req =
      -- Do something clever with the request
      pure NoContent
@
-}
data RawRequest

instance HasServer api ctx => HasServer (RawRequest :> api) ctx where
  type ServerT (RawRequest :> api) m = Request -> ServerT api m

  hoistServerWithContext _ ctx nt server =
    hoistServerWithContext (Proxy @api) ctx nt . server
  route _ ctx server =
    route (Proxy @api) ctx $
      server `passToServer` \req ->
        req