module Network.IHttp.Request
(
request,
requestLine,
enumRequest,
enumRequestLine
)
where
import qualified Data.ByteString as B
import Data.ByteString (ByteString)
import Data.Enumerator as E
import Data.Enumerator.List as EL
import Network.IHttp.Header
import Network.IHttp.Parsers
import Network.IHttp.Tools
import Network.IHttp.Types
enumRequest :: forall b m. Monad m => Request -> Enumerator ByteString m b
enumRequest req =
E.concatEnums [ enumRequestLine (requestMethod req)
(requestUri req)
(requestVersion req),
enumHeaders (requestHeaders req),
emptyLine ]
where
emptyLine :: Enumerator ByteString m b
emptyLine (Continue k) = k (Chunks ["\r\n"])
emptyLine step = returnI step
enumRequestLine ::
forall b m. Monad m =>
HttpMethod -> ByteString -> HttpVersion -> Enumerator ByteString m b
enumRequestLine method uri version = enum
where
enum :: Enumerator ByteString m b
enum (Continue k) = k (Chunks reqChunks)
enum step = returnI step
reqChunks :: [ByteString]
reqChunks = [ showMethod method, space, uri, space,
showVersion version, "\r\n" ]
where
space = B.singleton 32
request :: Monad m => Int -> Int -> Iteratee ByteString m Request
request maxHeadLine maxHeaders = do
req <- requestLine
headers <- httpHeaders maxHeadLine maxHeaders
return req { requestHeaders = headers }
requestLine :: Monad m => Iteratee ByteString m Request
requestLine =
EL.head
>>= maybe (throwError $ InvalidRequestError "Premature end of stream") return
>>= parseIter requestLineP InvalidRequestError