--- /dev/null
+module Network.HTTP.Lucu.ContentCoding
+ ( acceptEncodingListP
+ , normalizeCoding
+ , unnormalizeCoding
+ , orderAcceptEncodings
+ )
+ where
+
+import Data.Char
+import Data.Maybe
+import Network.HTTP.Lucu.Parser
+import Network.HTTP.Lucu.Parser.Http
+
+
+acceptEncodingListP :: Parser [(String, Maybe Double)]
+acceptEncodingListP = allowEOF $! listOf accEncP
+
+
+accEncP :: Parser (String, Maybe Double)
+accEncP = do coding <- token
+ qVal <- option Nothing
+ $ do string ";q="
+ q <- qvalue
+ return $ Just q
+ return (normalizeCoding coding, qVal)
+
+
+normalizeCoding :: String -> String
+normalizeCoding coding
+ = case map toLower coding of
+ "x-gzip" -> "gzip"
+ "x-compress" -> "compress"
+ other -> other
+
+
+unnormalizeCoding :: String -> String
+unnormalizeCoding coding
+ = case map toLower coding of
+ "gzip" -> "x-gzip"
+ "compress" -> "x-compress"
+ other -> other
+
+
+orderAcceptEncodings :: (String, Maybe Double) -> (String, Maybe Double) -> Ordering
+orderAcceptEncodings (_, q1) (_, q2)
+ = fromMaybe 0 q1 `compare` fromMaybe 0 q2