+-- #prune
+
+-- |Definition of things related on HTTP request.
+--
+-- In general you don't have to use this module directly.
module Network.HTTP.Lucu.Request
( Method(..)
- , Request
- , requestP -- Parser Request
+ , Request(..)
+ , requestP
)
where
-import qualified Data.ByteString.Lazy.Char8 as B
-import Data.ByteString.Lazy.Char8 (ByteString)
import Network.HTTP.Lucu.Headers
import Network.HTTP.Lucu.HttpVersion
import Network.HTTP.Lucu.Parser
import Network.HTTP.Lucu.Parser.Http
import Network.URI
+-- |This is the definition of HTTP request methods, which shouldn't
+-- require any description.
data Method = OPTIONS
| GET
| HEAD
+ | POST
| PUT
| DELETE
| TRACE
| CONNECT
- | ExtensionMethod String
+ | ExtensionMethod !String
deriving (Eq, Show)
-
+-- |This is the definition of HTTP reqest.
data Request
= Request {
- reqMethod :: Method
- , reqURI :: URI
- , reqVersion :: HttpVersion
- , reqHeaders :: Headers
- , reqBody :: Maybe ByteString
+ reqMethod :: !Method
+ , reqURI :: !URI
+ , reqVersion :: !HttpVersion
+ , reqHeaders :: !Headers
}
- deriving (Show)
+ deriving (Show, Eq)
instance HasHeaders Request where
getHeaders = reqHeaders
requestP :: Parser Request
requestP = do many crlf
(method, uri, version) <- requestLineP
- let req = Request {
- reqMethod = method
- , reqURI = uri
- , reqVersion = version
- , reqHeaders = emptyHeaders -- FIXME
- , reqBody = Nothing -- FIXME
- }
- return req
+ headers <- headersP
+ return Request {
+ reqMethod = method
+ , reqURI = uri
+ , reqVersion = version
+ , reqHeaders = headers
+ }
requestLineP :: Parser (Method, URI, HttpVersion)
methodP = (let methods = [ ("OPTIONS", OPTIONS)
, ("GET" , GET )
, ("HEAD" , HEAD )
+ , ("POST" , POST )
, ("PUT" , PUT )
, ("DELETE" , DELETE )
, ("TRACE" , TRACE )
in foldl (<|>) (fail "") $ map (\ (str, mth)
-> string str >> return mth) methods)
<|>
- many1 token >>= return . ExtensionMethod
+ token >>= return . ExtensionMethod
uriP :: Parser URI