{-# LANGUAGE OverloadedStrings , UnicodeSyntax #-} -- |An internal module for HTTP version numbers. module Network.HTTP.Lucu.HttpVersion ( HttpVersion(..) , printHttpVersion , httpVersion ) where 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) | majA > majB = GT | majA < majB = LT | minA > minB = GT | minA < minB = LT | otherwise = EQ -- |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 (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))