{- |
 Requests processed by handlers.
-}
module WebGear.Core.Request (
  -- * WebGear Request
  Request (..),
  remoteHost,
  httpVersion,
  isSecure,
  requestMethod,
  pathInfo,
  queryString,
  requestHeader,
  requestHeaders,
  requestBodyLength,
  getRequestBodyChunk,
) where

import Data.ByteString (ByteString)
import Data.List (find)
import Data.Text (Text)
import qualified Network.HTTP.Types as HTTP
import Network.Socket (SockAddr)
import qualified Network.Wai as Wai

-- | A request processed by a handler
newtype Request = Request
  { -- | underlying WAI request
    Request -> Request
waiRequest :: Wai.Request
  }

-- | Get the value of a request header
requestHeader :: HTTP.HeaderName -> Request -> Maybe ByteString
requestHeader :: HeaderName -> Request -> Maybe ByteString
requestHeader HeaderName
h Request
r = (HeaderName, ByteString) -> ByteString
forall a b. (a, b) -> b
snd ((HeaderName, ByteString) -> ByteString)
-> Maybe (HeaderName, ByteString) -> Maybe ByteString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((HeaderName, ByteString) -> Bool)
-> [(HeaderName, ByteString)] -> Maybe (HeaderName, ByteString)
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find ((HeaderName -> HeaderName -> Bool
forall a. Eq a => a -> a -> Bool
== HeaderName
h) (HeaderName -> Bool)
-> ((HeaderName, ByteString) -> HeaderName)
-> (HeaderName, ByteString)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HeaderName, ByteString) -> HeaderName
forall a b. (a, b) -> a
fst) (Request -> [(HeaderName, ByteString)]
requestHeaders Request
r)

-- | See 'Wai.getRequestBodyChunk'
getRequestBodyChunk :: Request -> IO ByteString
getRequestBodyChunk :: Request -> IO ByteString
getRequestBodyChunk = Request -> IO ByteString
Wai.getRequestBodyChunk (Request -> IO ByteString)
-> (Request -> Request) -> Request -> IO ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
waiRequest

-- | See 'Wai.httpVersion'
httpVersion :: Request -> HTTP.HttpVersion
httpVersion :: Request -> HttpVersion
httpVersion = Request -> HttpVersion
Wai.httpVersion (Request -> HttpVersion)
-> (Request -> Request) -> Request -> HttpVersion
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
waiRequest

-- | See 'Wai.isSecure'
isSecure :: Request -> Bool
isSecure :: Request -> Bool
isSecure = Request -> Bool
Wai.isSecure (Request -> Bool) -> (Request -> Request) -> Request -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
waiRequest

-- | See 'Wai.pathInfo'
pathInfo :: Request -> [Text]
pathInfo :: Request -> [Text]
pathInfo = Request -> [Text]
Wai.pathInfo (Request -> [Text]) -> (Request -> Request) -> Request -> [Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
waiRequest

-- | See 'Wai.queryString'
queryString :: Request -> HTTP.Query
queryString :: Request -> Query
queryString = Request -> Query
Wai.queryString (Request -> Query) -> (Request -> Request) -> Request -> Query
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
waiRequest

-- | See 'Wai.remoteHost'
remoteHost :: Request -> SockAddr
remoteHost :: Request -> SockAddr
remoteHost = Request -> SockAddr
Wai.remoteHost (Request -> SockAddr)
-> (Request -> Request) -> Request -> SockAddr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
waiRequest

-- | See 'Wai.requestBodyLength'
requestBodyLength :: Request -> Wai.RequestBodyLength
requestBodyLength :: Request -> RequestBodyLength
requestBodyLength = Request -> RequestBodyLength
Wai.requestBodyLength (Request -> RequestBodyLength)
-> (Request -> Request) -> Request -> RequestBodyLength
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
waiRequest

-- | See 'Wai.requestHeaders'
requestHeaders :: Request -> HTTP.RequestHeaders
requestHeaders :: Request -> [(HeaderName, ByteString)]
requestHeaders = Request -> [(HeaderName, ByteString)]
Wai.requestHeaders (Request -> [(HeaderName, ByteString)])
-> (Request -> Request) -> Request -> [(HeaderName, ByteString)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
waiRequest

-- | See 'Wai.requestMethod'
requestMethod :: Request -> HTTP.Method
requestMethod :: Request -> ByteString
requestMethod = Request -> ByteString
Wai.requestMethod (Request -> ByteString)
-> (Request -> Request) -> Request -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
waiRequest