packages feed

webgear-core-1.1.0: src/WebGear/Core/Response.hs

{- |
 Responses from handlers.
-}
module WebGear.Core.Response (
  -- * Basic Types
  Response (..),
  ResponseBody (..),
  toWaiResponse,
) where

import qualified Data.Binary.Builder as B
import qualified Network.HTTP.Types as HTTP
import qualified Network.Wai as Wai

{- | An HTTP response sent from the server to the client.

The response contains a status, optional headers and an optional
body payload.
-}
data Response = Response
  { responseStatus :: HTTP.Status
  -- ^ Response status code
  , responseHeaders :: HTTP.ResponseHeaders
  -- ^ Response headers
  , responseBody :: ResponseBody
  -- ^ The response body
  }

data ResponseBody
  = ResponseBodyFile FilePath (Maybe Wai.FilePart)
  | ResponseBodyBuilder B.Builder
  | ResponseBodyStream Wai.StreamingBody

-- | Generate a WAI response
toWaiResponse :: Response -> Wai.Response
toWaiResponse Response{..} =
  case responseBody of
    ResponseBodyFile fpath fpart ->
      Wai.responseFile responseStatus responseHeaders fpath fpart
    ResponseBodyBuilder builder ->
      Wai.responseBuilder responseStatus responseHeaders builder
    ResponseBodyStream stream ->
      Wai.responseStream responseStatus responseHeaders stream