1 -- |This is an auxiliary parser utilities for parsing things related
4 -- In general you don't have to use this module directly.
5 module Network.HTTP.Lucu.Parser.Http
21 import Network.HTTP.Lucu.Parser
23 -- |@'isCtl' c@ is 'Prelude.False' iff @0x20 <= @c@ < 0x7F@.
30 -- |@'isSeparator' c@ is 'Prelude.True' iff c is one of HTTP
32 isSeparator :: Char -> Bool
33 isSeparator '(' = True
34 isSeparator ')' = True
35 isSeparator '<' = True
36 isSeparator '>' = True
37 isSeparator '@' = True
38 isSeparator ',' = True
39 isSeparator ';' = True
40 isSeparator ':' = True
41 isSeparator '\\' = True
42 isSeparator '"' = True
43 isSeparator '/' = True
44 isSeparator '[' = True
45 isSeparator ']' = True
46 isSeparator '?' = True
47 isSeparator '=' = True
48 isSeparator '{' = True
49 isSeparator '}' = True
50 isSeparator ' ' = True
51 isSeparator '\t' = True
54 -- |@'isChar' c@ is 'Prelude.True' iff @c <= 0x7f@.
55 isChar :: Char -> Bool
60 -- |@'isToken' c@ is equivalent to @not ('isCtl' c || 'isSeparator'
62 isToken :: Char -> Bool
64 not (isCtl c || isSeparator c)
66 -- |@'listOf' p@ is similar to @'Network.HTTP.Lucu.Parser.sepBy' p
67 -- ('Network.HTTP.Lucu.Parser.char' \',\')@ but it allows any
68 -- occurrences of LWS before and after each tokens.
69 listOf :: Parser a -> Parser [a]
72 sepBy p $! do many lws
76 -- |'token' is equivalent to @'Network.HTTP.Lucu.Parser.many1' $
77 -- 'Network.HTTP.Lucu.Parser.satisfy' 'isToken'@
78 token :: Parser String
79 token = many1 $! satisfy isToken
81 -- |'lws' is an HTTP LWS: @'Network.HTTP.Lucu.Parser.crlf'?
82 -- ('Network.HTTP.Lucu.Parser.sp' | 'Network.HTTP.Lucu.Parser.ht')+@
84 lws = do s <- option "" crlf
85 xs <- many1 (sp <|> ht)
88 -- |'text' accepts one character which doesn't satisfy 'isCtl'.
90 text = satisfy (\ c -> not (isCtl c))
92 -- |'separator' accepts one character which satisfies 'isSeparator'.
93 separator :: Parser Char
94 separator = satisfy isSeparator
96 -- |'quotedStr' accepts a string surrounded by double quotation
97 -- marks. Quotes can be escaped by backslashes.
98 quotedStr :: Parser String
99 quotedStr = do char '"'
100 xs <- many (qdtext <|> quotedPair)
102 return $ foldr (++) "" xs
104 qdtext = do c <- satisfy (/= '"')
107 quotedPair = do q <- char '\\'
111 -- |'qvalue' accepts a so-called qvalue.
112 qvalue :: Parser Double
113 qvalue = do x <- char '0'
116 xs <- many digit -- 本當は三文字までに制限
123 xs <- many (char '0') -- 本當は三文字までに制限