--- #hide
+{-# LANGUAGE
+ UnicodeSyntax
+ #-}
module Network.HTTP.Lucu.Chunk
( chunkHeaderP -- Num a => Parser a
, chunkFooterP -- Parser ()
, chunkTrailerP -- Parser Headers
)
where
-
-import Network.HTTP.Lucu.Headers
-import Network.HTTP.Lucu.Parser
-import Network.HTTP.Lucu.Parser.Http
-import Numeric
-
-
-chunkHeaderP :: Num a => Parser a
-chunkHeaderP = do hexLen <- many1 hexDigit
+import Control.Applicative
+import Data.Attoparsec.Char8
+import Data.Bits
+import Network.HTTP.Lucu.Headers
+import Network.HTTP.Lucu.Parser.Http
+
+chunkHeaderP ∷ (Integral a, Bits a) ⇒ Parser a
+{-# INLINEABLE chunkHeaderP #-}
+chunkHeaderP = do len ← hexadecimal
extension
crlf
-
- let [(len, _)] = readHex hexLen
return len
where
- extension :: Parser ()
- extension = do many $ do char ';'
- token
- char '='
- token <|> quotedStr
+ extension ∷ Parser ()
+ extension = skipMany $
+ do _ ← char ';'
+ _ ← token
+ _ ← char '='
+ _ ← token <|> quotedStr
return ()
+chunkFooterP ∷ Parser ()
+chunkFooterP = crlf
-chunkFooterP :: Parser ()
-chunkFooterP = crlf >> return ()
-
-
-chunkTrailerP :: Parser Headers
+chunkTrailerP ∷ Parser Headers
chunkTrailerP = headersP