module Network.HTTP.Lucu.Parser.Http
( isCtl -- Char -> Bool
, isSeparator -- Char -> Bool
- , token -- Parser Char
+ , isChar -- Char -> Bool
+ , token -- Parser String
+ , lws -- Parser String
+ , text -- Parser Char
+ , separator -- Parser Char
+ , quotedStr -- Parser String
)
where
isSeparator c = elem c "()<>@,;:\\\"/[]?={} \t"
-token :: Parser Char
-token = satisfy (\ c -> not (isCtl c || isSeparator c))
+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]