OverloadedStrings
, UnicodeSyntax
#-}
--- |Manipulation of HTTP version string.
+-- |HTTP version number
module Network.HTTP.Lucu.HttpVersion
( HttpVersion(..)
- , httpVersionP
, printHttpVersion
+
+ , httpVersionP
)
where
import qualified Blaze.Text.Int as BT
import Data.Monoid.Unicode
import Prelude hiding (min)
--- |@'HttpVersion' major minor@ represents \"HTTP\/major.minor\".
+-- |An HTTP version consists of major and minor versions.
data HttpVersion
= HttpVersion !Int !Int
deriving (Eq, Show)
| minA < minB = LT
| otherwise = EQ
-httpVersionP ∷ Parser HttpVersion
-httpVersionP = string "HTTP/"
- *>
- choice [ string "1.1" *> pure (HttpVersion 1 1)
- , string "1.0" *> pure (HttpVersion 1 0)
- , HttpVersion <$> decimal ⊛ (char '.' *> decimal)
- ]
-
-- |Convert an 'HttpVersion' to 'AsciiBuilder'.
printHttpVersion ∷ HttpVersion → AsciiBuilder
printHttpVersion v
= case v of
- -- 頻出するので高速化
+ -- Optimisation for special cases.
HttpVersion 1 0 → A.toAsciiBuilder "HTTP/1.0"
HttpVersion 1 1 → A.toAsciiBuilder "HTTP/1.1"
- -- 一般の場合
+ -- General cases.
HttpVersion maj min
→ A.toAsciiBuilder "HTTP/" ⊕
A.unsafeFromBuilder (BT.integral maj) ⊕
A.toAsciiBuilder "." ⊕
A.unsafeFromBuilder (BT.integral min)
+
+-- |'Parser' for an 'HttpVersion'.
+httpVersionP ∷ Parser HttpVersion
+httpVersionP = string "HTTP/"
+ *>
+ choice [ string "1.1" *> pure (HttpVersion 1 1)
+ , string "1.0" *> pure (HttpVersion 1 0)
+ , HttpVersion <$> decimal ⊛ (char '.' *> decimal)
+ ]