X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=Lucu.git;a=blobdiff_plain;f=Network%2FHTTP%2FLucu%2FHttpVersion.hs;h=889042728fcdd310811bdfce67659430d1cbab32;hp=4531c837782ef9b6eda9edd4849e3771f2b0b0a1;hb=97295ba;hpb=e34910f85f459f049b9e6e6b79db9ef95dfccc13 diff --git a/Network/HTTP/Lucu/HttpVersion.hs b/Network/HTTP/Lucu/HttpVersion.hs index 4531c83..8890427 100644 --- a/Network/HTTP/Lucu/HttpVersion.hs +++ b/Network/HTTP/Lucu/HttpVersion.hs @@ -1,23 +1,28 @@ {-# LANGUAGE - BangPatterns + FlexibleInstances + , MultiParamTypeClasses , OverloadedStrings + , TemplateHaskell , UnicodeSyntax #-} -{-# OPTIONS_HADDOCK prune #-} - --- |Manipulation of HTTP version string. +-- |An internal module for HTTP version numbers. module Network.HTTP.Lucu.HttpVersion ( HttpVersion(..) - , httpVersionP - , hPutHttpVersion + , httpVersion ) where -import Control.Monad.Unicode +import Control.Applicative +import Control.Applicative.Unicode +import Data.Ascii (Ascii, AsciiBuilder) import Data.Attoparsec.Char8 -import Network.HTTP.Lucu.HandleLike +import Data.Convertible.Base +import Data.Convertible.Instances.Ascii () +import Data.Convertible.Utils +import Data.Monoid.Unicode import Prelude hiding (min) +import Prelude.Unicode --- |@'HttpVersion' major minor@ represents \"HTTP\/major.minor\". +-- |An HTTP version consists of major and minor versions. data HttpVersion = HttpVersion !Int !Int deriving (Eq, Show) @@ -30,26 +35,30 @@ instance Ord HttpVersion where | minA < minB = LT | otherwise = EQ -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 - ] +instance ConvertSuccess HttpVersion Ascii where + {-# INLINE convertSuccess #-} + convertSuccess = convertSuccessVia ((⊥) ∷ AsciiBuilder) + +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 ∷ HandleLike h ⇒ h → HttpVersion → IO () -hPutHttpVersion !h !v - = case v of - -- 頻出するので高速化 - HttpVersion 1 0 → hPutBS h "HTTP/1.0" - HttpVersion 1 1 → hPutBS h "HTTP/1.1" - -- 一般の場合 - HttpVersion !maj !min - → do hPutBS h "HTTP/" - hPutStr h (show maj) - hPutChar h '.' - hPutStr h (show min) +-- |'Parser' for an 'HttpVersion'. +httpVersion ∷ Parser HttpVersion +httpVersion = string "HTTP/" + *> + (HttpVersion <$> decimal ⊛ (char '.' *> decimal))