{- |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