, OverloadedStrings
, UnicodeSyntax
#-}
-{-# OPTIONS_HADDOCK prune #-}
-- |Manipulation of HTTP version string.
module Network.HTTP.Lucu.HttpVersion
( HttpVersion(..)
, httpVersionP
- , hPutHttpVersion
+ , printHttpVersion
)
where
-import Control.Monad.Unicode
+import qualified Blaze.Text.Int as BT
+import Control.Applicative
+import Control.Applicative.Unicode
+import Data.Ascii (AsciiBuilder)
+import qualified Data.Ascii as A
import Data.Attoparsec.Char8
-import Network.HTTP.Lucu.HandleLike
+import Data.Monoid.Unicode
import Prelude hiding (min)
-- |@'HttpVersion' major minor@ represents \"HTTP\/major.minor\".
httpVersionP ∷ Parser HttpVersion
httpVersionP = string "HTTP/"
- ≫
- choice [ string "1.1" ≫ return (HttpVersion 1 1)
- , string "1.0" ≫ return (HttpVersion 1 0)
- , do major ← decimal
- _ ← char '.'
- minor ← decimal
- return $ HttpVersion major minor
+ *>
+ choice [ string "1.1" *> pure (HttpVersion 1 1)
+ , string "1.0" *> pure (HttpVersion 1 0)
+ , HttpVersion <$> decimal ⊛ (char '.' *> decimal)
]
-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 "HTTP/1.0"
- HttpVersion 1 1 → hPutBS h "HTTP/1.1"
+ HttpVersion 1 0 → A.toAsciiBuilder "HTTP/1.0"
+ HttpVersion 1 1 → A.toAsciiBuilder "HTTP/1.1"
-- 一般の場合
- HttpVersion !maj !min
- → do hPutBS h "HTTP/"
- hPutStr h (show maj)
- hPutChar h '.'
- hPutStr h (show min)
+ HttpVersion maj min
+ → A.toAsciiBuilder "HTTP/" ⊕
+ A.unsafeFromBuilder (BT.integral maj) ⊕
+ A.toAsciiBuilder "." ⊕
+ A.unsafeFromBuilder (BT.integral min)