]> gitweb @ CieloNegro.org - Lucu.git/blobdiff - Network/HTTP/Lucu/Request.hs
rename: reqMustHaveBody --> reqHasBody
[Lucu.git] / Network / HTTP / Lucu / Request.hs
index 58286dbe6130733fcdc4b19057a061410df43a29..b6ffedbdb11ccf2ef0bfa2701998d0183e82c808 100644 (file)
@@ -1,5 +1,6 @@
 {-# LANGUAGE
-    OverloadedStrings
+    MultiParamTypeClasses
+  , OverloadedStrings
   , UnicodeSyntax
   , ViewPatterns
   #-}
 module Network.HTTP.Lucu.Request
     ( Method(..)
     , Request(..)
-    , reqMustHaveBody
-    , request
+    , reqHasBody
     )
     where
 import Control.Applicative
 import Control.Monad.Unicode
 import Data.Ascii (Ascii)
 import Data.Attoparsec.Char8
+import Data.Attoparsec.Parsable
+import Data.ByteString (ByteString)
 import qualified Data.ByteString.Char8 as C8
 import Network.HTTP.Lucu.Headers
 import Network.HTTP.Lucu.HttpVersion
@@ -53,36 +55,38 @@ instance HasHeaders Request where
     {-# INLINE setHeaders #-}
     setHeaders req hdr = req { reqHeaders = hdr }
 
--- |Returns 'True' iff the 'Request' must have an entity body.
-reqMustHaveBody ∷ Request → Bool
-{-# INLINEABLE reqMustHaveBody #-}
-reqMustHaveBody (reqMethod → m)
+-- |Returns 'True' iff the 'Request' would have an entity body.
+reqHasBody ∷ Request → Bool
+{-# INLINEABLE reqHasBody #-}
+reqHasBody (reqMethod → m)
     | m ≡ POST  = True
     | m ≡ PUT   = True
     | otherwise = False
 
--- |'Parser' for a 'Request'.
-request ∷ Parser Request
-request = do skipMany crlf
-             (meth, u, ver) ← requestLine
-             hdrs           ← headers
-             return Request {
-                          reqMethod  = meth
-                        , reqURI     = u
-                        , reqVersion = ver
-                        , reqHeaders = hdrs
-                        }
+instance Parsable ByteString Request where
+    {-# INLINEABLE parser #-}
+    parser = do skipMany crlf
+                (meth, u, ver) ← requestLine
+                hdrs           ← parser
+                return Request {
+                             reqMethod  = meth
+                           , reqURI     = u
+                           , reqVersion = ver
+                           , reqHeaders = hdrs
+                           }
 
 requestLine ∷ Parser (Method, URI, HttpVersion)
+{-# INLINEABLE requestLine #-}
 requestLine = do meth ← method
                  sp
                  u ← uri
                  sp
-                 ver ← httpVersion
+                 ver ← parser
                  crlf
                  return (meth, u, ver)
 
 method ∷ Parser Method
+{-# INLINEABLE method #-}
 method = choice
          [ string "OPTIONS" ≫ return OPTIONS
          , string "GET"     ≫ return GET
@@ -96,6 +100,7 @@ method = choice
          ]
 
 uri ∷ Parser URI
+{-# INLINEABLE uri #-}
 uri = do bs ← takeWhile1 (\c → (¬) (isCtl c ∨ c ≡ '\x20'))
          let str = C8.unpack bs
          case parseURIReference str of