X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=Lucu.git;a=blobdiff_plain;f=Network%2FHTTP%2FLucu%2FRequest.hs;fp=Network%2FHTTP%2FLucu%2FRequest.hs;h=2fcfc9123e3c8e07f343ba3d9211556d4a4c2ed7;hp=58286dbe6130733fcdc4b19057a061410df43a29;hb=1de2506621977a383b991cadce024f626023908b;hpb=5f2ef377345fc47aabc63c1325df82c1cd9da9ed diff --git a/Network/HTTP/Lucu/Request.hs b/Network/HTTP/Lucu/Request.hs index 58286db..2fcfc91 100644 --- a/Network/HTTP/Lucu/Request.hs +++ b/Network/HTTP/Lucu/Request.hs @@ -1,5 +1,6 @@ {-# LANGUAGE - OverloadedStrings + MultiParamTypeClasses + , OverloadedStrings , UnicodeSyntax , ViewPatterns #-} @@ -10,13 +11,14 @@ module Network.HTTP.Lucu.Request ( Method(..) , Request(..) , reqMustHaveBody - , request ) 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 @@ -61,28 +63,30 @@ reqMustHaveBody (reqMethod → m) | 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