X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=Lucu.git;a=blobdiff_plain;f=Network%2FHTTP%2FLucu%2FHttpVersion.hs;h=889042728fcdd310811bdfce67659430d1cbab32;hp=15ead365cdf6403a2e53eece4dbc117a1c8dcfef;hb=97295ba;hpb=858129cb755aa09da2b7bd758efb8519f2c89103 diff --git a/Network/HTTP/Lucu/HttpVersion.hs b/Network/HTTP/Lucu/HttpVersion.hs index 15ead36..8890427 100644 --- a/Network/HTTP/Lucu/HttpVersion.hs +++ b/Network/HTTP/Lucu/HttpVersion.hs @@ -1,24 +1,31 @@ --- #prune - --- |Manipulation of HTTP version string. +{-# LANGUAGE + FlexibleInstances + , MultiParamTypeClasses + , OverloadedStrings + , TemplateHaskell + , UnicodeSyntax + #-} +-- |An internal module for HTTP version numbers. module Network.HTTP.Lucu.HttpVersion ( HttpVersion(..) - , httpVersionP - , hPutHttpVersion + , httpVersion ) where +import Control.Applicative +import Control.Applicative.Unicode +import Data.Ascii (Ascii, AsciiBuilder) +import Data.Attoparsec.Char8 +import Data.Convertible.Base +import Data.Convertible.Instances.Ascii () +import Data.Convertible.Utils +import Data.Monoid.Unicode +import Prelude hiding (min) +import Prelude.Unicode -import qualified Data.ByteString.Lazy.Char8 as B -import Data.ByteString.Lazy.Char8 (ByteString) -import Network.HTTP.Lucu.Parser -import System.IO - --- |@'HttpVersion' major minor@ represents \"HTTP\/major.minor\". -data HttpVersion = HttpVersion !Int !Int - deriving (Eq) - -instance Show HttpVersion where - show (HttpVersion maj min) = "HTTP/" ++ show maj ++ "." ++ show min +-- |An HTTP version consists of major and minor versions. +data HttpVersion + = HttpVersion !Int !Int + deriving (Eq, Show) instance Ord HttpVersion where (HttpVersion majA minA) `compare` (HttpVersion majB minB) @@ -28,19 +35,30 @@ instance Ord HttpVersion where | minA < minB = LT | otherwise = EQ +instance ConvertSuccess HttpVersion Ascii where + {-# INLINE convertSuccess #-} + convertSuccess = convertSuccessVia ((⊥) ∷ AsciiBuilder) -httpVersionP :: Parser HttpVersion -httpVersionP = do string "HTTP/" - major <- many1 digit - char '.' - minor <- many1 digit - return $ HttpVersion (read major) (read minor) +instance ConvertSuccess HttpVersion AsciiBuilder where + {-# INLINE convertSuccess #-} + convertSuccess v + = case v of + -- Optimisation for special cases. + HttpVersion 1 0 → cs ("HTTP/1.0" ∷ Ascii) + HttpVersion 1 1 → cs ("HTTP/1.1" ∷ Ascii) + -- General (but almost never occuring) cases. + HttpVersion maj min + → cs ("HTTP/" ∷ Ascii) ⊕ + convertUnsafe (show maj) ⊕ + cs ("." ∷ Ascii) ⊕ + convertUnsafe (show min) +deriveAttempts [ ([t| HttpVersion |], [t| Ascii |]) + , ([t| HttpVersion |], [t| AsciiBuilder |]) + ] -hPutHttpVersion :: Handle -> HttpVersion -> IO () -hPutHttpVersion h (HttpVersion maj min) - = h `seq` - do hPutStr h "HTTP/" - hPutStr h (show maj) - hPutChar h '.' - hPutStr h (show min) \ No newline at end of file +-- |'Parser' for an 'HttpVersion'. +httpVersion ∷ Parser HttpVersion +httpVersion = string "HTTP/" + *> + (HttpVersion <$> decimal ⊛ (char '.' *> decimal))