-{-# OPTIONS_HADDOCK prune #-}
-
--- |Manipulation of HTTP version string.
+{-# LANGUAGE
+ OverloadedStrings
+ , UnicodeSyntax
+ #-}
+-- |HTTP version number
module Network.HTTP.Lucu.HttpVersion
( HttpVersion(..)
- , httpVersionP
- , hPutHttpVersion
+ , printHttpVersion
+ , httpVersion
)
where
-
-import qualified Data.ByteString.Char8 as C8
-import Network.HTTP.Lucu.HandleLike
-import Network.HTTP.Lucu.Parser
-import Prelude hiding (min)
-
--- |@'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
+import Control.Applicative
+import Control.Applicative.Unicode
+import Data.Ascii (AsciiBuilder)
+import qualified Data.Ascii as A
+import Data.Attoparsec.Char8
+import Data.Monoid.Unicode
+import Prelude hiding (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)
| minA < minB = LT
| otherwise = EQ
-
-httpVersionP :: Parser HttpVersion
-httpVersionP = string "HTTP/"
- >>
- -- 頻出するので高速化
- choice [ do string "1.0"
- return $ HttpVersion 1 0
- , do string "1.1"
- return $ HttpVersion 1 1
- -- 一般の場合
- , do major <- many1 digit
- char '.'
- minor <- many1 digit
- return $ HttpVersion (read major) (read minor)
- ]
-
-
-hPutHttpVersion :: HandleLike h => h -> HttpVersion -> IO ()
-hPutHttpVersion !h !v
+-- |Convert an 'HttpVersion' to 'AsciiBuilder'.
+printHttpVersion ∷ HttpVersion → AsciiBuilder
+printHttpVersion v
= case v of
- -- 頻出するので高速化
- HttpVersion 1 0 -> hPutBS h (C8.pack "HTTP/1.0")
- HttpVersion 1 1 -> hPutBS h (C8.pack "HTTP/1.1")
- -- 一般の場合
- HttpVersion !maj !min
- -> do hPutBS h (C8.pack "HTTP/")
- hPutStr h (show maj)
- hPutChar h '.'
- hPutStr h (show min)
+ -- Optimisation for special cases.
+ HttpVersion 1 0 → A.toAsciiBuilder "HTTP/1.0"
+ HttpVersion 1 1 → A.toAsciiBuilder "HTTP/1.1"
+ -- General (but almost never stumbling) cases.
+ HttpVersion maj min
+ → A.toAsciiBuilder "HTTP/" ⊕
+ A.toAsciiBuilder (A.unsafeFromString $ show maj) ⊕
+ A.toAsciiBuilder "." ⊕
+ A.toAsciiBuilder (A.unsafeFromString $ show min)
+
+-- |'Parser' for an 'HttpVersion'.
+httpVersion ∷ Parser HttpVersion
+httpVersion = string "HTTP/"
+ *>
+ (HttpVersion <$> decimal ⊛ (char '.' *> decimal))