module Network.HTTP.Lucu.Parser.Http ( isCtl -- Char -> Bool , isSeparator -- Char -> Bool , isChar -- Char -> Bool , token -- Parser String , lws -- Parser String , text -- Parser Char , separator -- Parser Char , quotedStr -- Parser String ) where import qualified Data.ByteString.Lazy.Char8 as B import Data.ByteString.Lazy.Char8 (ByteString) import Data.List import Network.HTTP.Lucu.Parser isCtl :: Char -> Bool isCtl c | c < '\x1f' = True | c == '\x7f' = True | otherwise = False isSeparator :: Char -> Bool isSeparator c = elem c "()<>@,;:\\\"/[]?={} \t" isChar :: Char -> Bool isChar c | c <= '\x7f' = True | otherwise = False token :: Parser String token = many1 $ satisfy (\ c -> not (isCtl c || isSeparator c)) lws :: Parser String lws = do s <- option "" crlf xs <- many1 (sp <|> ht) return (s ++ xs) text :: Parser Char text = satisfy (\ c -> not (isCtl c)) separator :: Parser Char separator = satisfy isSeparator quotedStr :: Parser String quotedStr = do char '"' xs <- many (qdtext <|> quotedPair) char '"' return $ foldr (++) "" (["\""] ++ xs ++ ["\""]) where qdtext = char '"' >> fail "" <|> do c <- text return [c] quotedPair = do q <- char '\\' c <- satisfy isChar return [q, c]