@@ -11,55 +11,55 @@ module RFC2616
12import Control.Applicative
12import Control.Applicative
13import Data.Attoparsec.ByteString as P
13import Data.Attoparsec.ByteString as P
14−import qualified Data.Attoparsec.ByteString.Char8 as P8
15import Data.Attoparsec.ByteString.Char8 (char8, endOfLine, isDigit_w8)
14import Data.Attoparsec.ByteString.Char8 (char8, endOfLine, isDigit_w8)
15+import Data.ByteString (ByteString)
16import Data.Word (Word8)
16import Data.Word (Word8)
17−import qualified Data.ByteString.Char8 as B
17+import Data.Attoparsec.ByteString.Char8 (isEndOfLine, isHorizontalSpace)
19isToken :: Word8 -> Bool
19isToken :: Word8 -> Bool
20isToken w = w <= 127 && notInClass "\0-\31()<>@,;:\\\"/[]?={} \t" w
20isToken w = w <= 127 && notInClass "\0-\31()<>@,;:\\\"/[]?={} \t" w
22skipSpaces :: Parser ()
22skipSpaces :: Parser ()
23−skipSpaces = satisfy P8.isHorizontalSpace *> skipWhile P8.isHorizontalSpace
23+skipSpaces = satisfy isHorizontalSpace *> skipWhile isHorizontalSpace
25data Request = Request {
25data Request = Request {
26− requestMethod :: B.ByteString
26+ requestMethod :: ByteString
27− , requestUri :: B.ByteString
27+ , requestUri :: ByteString
28− , requestVersion :: B.ByteString
28+ , requestVersion :: ByteString
29 } deriving (Eq, Ord, Show)
29 } deriving (Eq, Ord, Show)
31−httpVersion :: Parser B.ByteString
31+httpVersion :: Parser ByteString
32httpVersion = "HTTP/" *> P.takeWhile (\c -> isDigit_w8 c || c == 46)
32httpVersion = "HTTP/" *> P.takeWhile (\c -> isDigit_w8 c || c == 46)
34requestLine :: Parser Request
34requestLine :: Parser Request
35−requestLine = Request <$> (P.takeWhile1 isToken <* char8 ' ')
35+requestLine = Request <$> (takeWhile1 isToken <* char8 ' ')
36− <*> (P.takeWhile1 (/=32) <* char8 ' ')
36+ <*> (takeWhile1 (/=32) <* char8 ' ')
37 <*> (httpVersion <* endOfLine)
37 <*> (httpVersion <* endOfLine)
39data Header = Header {
39data Header = Header {
40− headerName :: B.ByteString
40+ headerName :: ByteString
41− , headerValue :: [B.ByteString]
41+ , headerValue :: [ByteString]
42 } deriving (Eq, Ord, Show)
42 } deriving (Eq, Ord, Show)
44messageHeader :: Parser Header
44messageHeader :: Parser Header
45messageHeader = Header
45messageHeader = Header
46− <$> (P.takeWhile isToken <* char8 ':' <* skipWhile P8.isHorizontalSpace)
46+ <$> (P.takeWhile isToken <* char8 ':' <* skipWhile isHorizontalSpace)
47− <*> ((:) <$> (takeTill P8.isEndOfLine <* endOfLine)
47+ <*> ((:) <$> (takeTill isEndOfLine <* endOfLine)
48− <*> (many $ skipSpaces *> takeTill P8.isEndOfLine <* endOfLine))
48+ <*> (many $ skipSpaces *> takeTill isEndOfLine <* endOfLine))
50request :: Parser (Request, [Header])
50request :: Parser (Request, [Header])
51request = (,) <$> requestLine <*> many messageHeader <* endOfLine
51request = (,) <$> requestLine <*> many messageHeader <* endOfLine
53data Response = Response {
53data Response = Response {
54− responseVersion :: B.ByteString
54+ responseVersion :: ByteString
55− , responseCode :: B.ByteString
55+ , responseCode :: ByteString
56− , responseMsg :: B.ByteString
56+ , responseMsg :: ByteString
57 } deriving (Eq, Ord, Show)
57 } deriving (Eq, Ord, Show)
59responseLine :: Parser Response
59responseLine :: Parser Response
60responseLine = Response <$> (httpVersion <* char8 ' ')
60responseLine = Response <$> (httpVersion <* char8 ' ')
61 <*> (P.takeWhile isDigit_w8 <* char8 ' ')
61 <*> (P.takeWhile isDigit_w8 <* char8 ' ')
62− <*> (P.takeTill P8.isEndOfLine <* endOfLine)
62+ <*> (takeTill isEndOfLine <* endOfLine)
64response :: Parser (Response, [Header])
64response :: Parser (Response, [Header])
65response = (,) <$> responseLine <*> many messageHeader <* endOfLine
65response = (,) <$> responseLine <*> many messageHeader <* endOfLine