{-|
See
.
-}
module Belka.Attoparsec.ByteString
where
import Belka.Prelude hiding (fail)
import Data.Attoparsec.ByteString
import qualified Belka.BytePredicates as A
import qualified Belka.MonadPlus as B
import qualified Data.HashMap.Strict as C
import qualified Ptr.Poking as D
import qualified Ptr.ByteString as E
contentTypeHeader :: Parser (ByteString, HashMap ByteString ByteString)
contentTypeHeader =
do
mimeType <- takeWhile1 A.mimeType
parameters <- B.foldl (\ table (k, v) -> C.insert k v table) mempty parameter
return (mimeType, parameters)
where
parameter =
do
skipWhile A.space
semicolon
skipWhile A.space
attribute <- token
equality
value <- token <|> quotedToken
return (attribute, value)
quotedToken :: Parser ByteString
quotedToken =
quote *> (lowerCaseBytesInIso8859_1 . E.poking <$> B.foldl mappend mempty segment) <* quote
where
segment =
(D.bytes <$> takeWhile1 A.quotedTokenUnescaped) <|>
(D.word8 34 <$ (backslash *> quote))
token :: Parser ByteString
token =
lowerCaseBytesInIso8859_1 <$> takeWhile1 A.token
backslash :: Parser Word8
backslash =
word8 92
quote :: Parser Word8
quote =
word8 34
equality :: Parser Word8
equality =
word8 61
semicolon :: Parser Word8
semicolon =
word8 59