+-- |This is an auxiliary parser utilities for parsing things related
+-- on HTTP protocol.
+--
+-- In general you don't have to use this module directly.
module Network.HTTP.Lucu.Parser.Http
- ( isCtl -- Char -> Bool
- , isSeparator -- Char -> Bool
- , isChar -- Char -> Bool
- , isToken -- Char -> Bool
- , listOf -- Parser a -> Parser [a]
- , token -- Parser String
- , lws -- Parser String
- , text -- Parser Char
- , separator -- Parser Char
- , quotedStr -- Parser String
+ ( isCtl
+ , isSeparator
+ , isChar
+ , isToken
+ , listOf
+ , token
+ , lws
+ , text
+ , separator
+ , quotedStr
)
where
import Data.List
import Network.HTTP.Lucu.Parser
+-- |@'isCtl' c@ is True iff @0x20 <= @c@ < 0x7F@.
isCtl :: Char -> Bool
isCtl c
| c < '\x1f' = True
| c >= '\x7f' = True
| otherwise = False
-
+-- |@'isSeparator' c@ is True iff c is one of HTTP separators.
isSeparator :: Char -> Bool
isSeparator c = elem c "()<>@,;:\\\"/[]?={} \t"
-
+-- |@'isChar' c@ is True iff @c <= 0x7f@.
isChar :: Char -> Bool
isChar c
| c <= '\x7f' = True
| otherwise = False
-
+-- |@'isToken' c@ is equivalent to @not ('isCtl' c || 'isSeparator'
+-- c)@
isToken :: Char -> Bool
isToken c = not (isCtl c || isSeparator c)
-
+-- |@'listOf' p@ is similar to @'Network.HTTP.Lucu.Parser.sepBy' p
+-- ('Network.HTTP.Lucu.Parser.char' \',\')@ but it allows any
+-- occurrences of LWS before and after each tokens.
listOf :: Parser a -> Parser [a]
listOf p = do many lws
sepBy p (do many lws
char ','
many lws)
-
+-- |'token' is equivalent to @'Network.HTTP.Lucu.Parser.many1' $
+-- 'Network.HTTP.Lucu.Parser.satisfy' 'isToken'@
token :: Parser String
token = many1 $ satisfy isToken
-
+-- |'lws' is an HTTP LWS: @'Network.HTTP.Lucu.Parser.crlf'?
+-- ('Network.HTTP.Lucu.Parser.sp' | 'Network.HTTP.Lucu.Parser.ht')+@
lws :: Parser String
lws = do s <- option "" crlf
xs <- many1 (sp <|> ht)
return (s ++ xs)
-
+-- |'text' accepts one character which doesn't satisfy 'isCtl'.
text :: Parser Char
text = satisfy (\ c -> not (isCtl c))
-
+-- |'separator' accepts one character which satisfies 'isSeparator'.
separator :: Parser Char
separator = satisfy isSeparator
-
+-- |'quotedStr' accepts a string surrounded by double quotation
+-- marks. Quotes can be escaped by backslashes.
quotedStr :: Parser String
quotedStr = do char '"'
xs <- many (qdtext <|> quotedPair)