@@ -17,6 +17,8 @@ import Criterion.Main
18-- >>> :set -XOverloadedStrings
18-- >>> :set -XOverloadedStrings
20+----------------------------------------------------------------
20main :: IO ()
22main :: IO ()
22 let requestLine1 = "GET http://www.example.com HTTP/1.1"
24 let requestLine1 = "GET http://www.example.com HTTP/1.1"
@@ -35,10 +37,11 @@ main = do
35----------------------------------------------------------------
37----------------------------------------------------------------
37parseRequestLine2 :: ByteString
39parseRequestLine2 :: ByteString
38− -> IO (H.Method
40+ -> IO (H.Method
39− ,ByteString -- Path
41+ ,ByteString -- Path
40− ,ByteString -- Query
42+ ,ByteString -- Query
41− ,H.HttpVersion)
43+ ,H.HttpVersion)
42parseRequestLine2 requestLine = undefined
45parseRequestLine2 requestLine = undefined
44----------------------------------------------------------------
47----------------------------------------------------------------
@@ -49,15 +52,15 @@ parseRequestLine2 requestLine = undefined
49-- ("GET","/","",HTTP/1.1)
52-- ("GET","/","",HTTP/1.1)
50-- >>> parseRequestLine1 "POST /cgi/search.cgi?key=foo HTTP/1.0"
53-- >>> parseRequestLine1 "POST /cgi/search.cgi?key=foo HTTP/1.0"
51-- ("POST","/cgi/search.cgi","?key=foo",HTTP/1.0)
54-- ("POST","/cgi/search.cgi","?key=foo",HTTP/1.0)
52−-- >>> parseRequestLine1 "GET /NoHTTPVersion"
55+-- >>> parseRequestLine1 "GET "
53−-- *** Exception: BadFirstLine "GET /NoHTTPVersion"
56+-- *** Exception: BadFirstLine "GET "
54-- >>> parseRequestLine1 "GET /NotHTTP UNKNOWN/1.1"
57-- >>> parseRequestLine1 "GET /NotHTTP UNKNOWN/1.1"
55-- *** Exception: NonHttp
58-- *** Exception: NonHttp
56parseRequestLine1 :: ByteString
59parseRequestLine1 :: ByteString
57− -> IO (H.Method
60+ -> IO (H.Method
58− ,ByteString -- Path
61+ ,ByteString -- Path
59− ,ByteString -- Query
62+ ,ByteString -- Query
60− ,H.HttpVersion)
63+ ,H.HttpVersion)
61parseRequestLine1 requestLine = do
64parseRequestLine1 requestLine = do
62 let (!method,!rest) = S.breakByte 32 requestLine -- ' '
65 let (!method,!rest) = S.breakByte 32 requestLine -- ' '
63 (!pathQuery,!httpVer') = S.breakByte 32 (S.drop 1 rest) -- ' '
66 (!pathQuery,!httpVer') = S.breakByte 32 (S.drop 1 rest) -- ' '
@@ -73,6 +76,16 @@ parseRequestLine1 requestLine = do
74----------------------------------------------------------------
77----------------------------------------------------------------
81+-- >>> parseRequestLine0 "GET / HTTP/1.1"
82+-- ("GET","/","",HTTP/1.1)
83+-- >>> parseRequestLine0 "POST /cgi/search.cgi?key=foo HTTP/1.0"
84+-- ("POST","/cgi/search.cgi","?key=foo",HTTP/1.0)
85+-- >>> parseRequestLine0 "GET "
86+-- *** Exception: BadFirstLine "GET "
87+-- >>> parseRequestLine0 "GET /NotHTTP UNKNOWN/1.1"
88+-- *** Exception: NonHttp
76parseRequestLine0 :: ByteString
89parseRequestLine0 :: ByteString
77 -> IO (H.Method
90 -> IO (H.Method
78 ,ByteString -- Path
91 ,ByteString -- Path