packages feed

wai-effectful-1.0.2: src/Effectful/Wai/Internal.hs

module Effectful.Wai.Internal where

import Data.ByteString (ByteString)
import Data.ByteString.Builder (Builder)
import Data.Text (Text)
import Data.Vault.Lazy (Vault)
import Effectful
import Network.HTTP.Types (HttpVersion, Method, Query, RequestHeaders, ResponseHeaders, Status)
import Network.Socket (SockAddr)
import Network.Wai (FilePart (..), RequestBodyLength (..))
import Prelude

-- | Lifted 'Network.Wai.Request'.
data Request es = Request
    { requestMethod :: Method
    , httpVersion :: HttpVersion
    , rawPathInfo :: ByteString
    , rawQueryString :: ByteString
    , requestHeaders :: RequestHeaders
    , isSecure :: Bool
    , remoteHost :: SockAddr
    , pathInfo :: [Text]
    , queryString :: Query
    , requestBody :: Eff es ByteString
    , vault :: Vault
    , requestBodyLength :: RequestBodyLength
    , requestHeaderHost :: Maybe ByteString
    , requestHeaderRange :: Maybe ByteString
    , requestHeaderReferer :: Maybe ByteString
    , requestHeaderUserAgent :: Maybe ByteString
    }

-- | Lifted 'Network.Wai.getRequestBodyChunk'.
getRequestBodyChunk :: Request es -> Eff es ByteString
getRequestBodyChunk = requestBody

-- | Lifted 'Network.Wai.setRequestBodyChunks'.
setRequestBodyChunks :: Eff es ByteString -> Request es -> Request es
setRequestBodyChunks body req = req{requestBody = body}

-- | Lifted 'Network.Wai.Response'.
data Response es
    = ResponseFile Status ResponseHeaders FilePath (Maybe FilePart)
    | ResponseBuilder Status ResponseHeaders Builder
    | ResponseStream Status ResponseHeaders (StreamingBody es)
    | ResponseRaw (Eff es ByteString -> (ByteString -> Eff es ()) -> Eff es ()) (Response es)

-- | Lifted 'Network.Wai.StreamingBody'.
type StreamingBody es = (Builder -> Eff es ()) -> Eff es () -> Eff es ()