-uriP ∷ Parser URI
-uriP = do bs ← takeWhile1 (\c → (¬) (isCtl c ∨ c ≡ '\x20'))
- let str = C8.unpack bs
- case parseURIReference str of
- Nothing -> fail ("Unparsable URI: " ⧺ str)
- Just uri -> return uri
+instance Default (Parser Request) where
+ {-# INLINEABLE def #-}
+ def = do skipMany crlf
+ (meth, u, ver) ← requestLine
+ hdrs ← def
+ return Request {
+ reqMethod = meth
+ , reqURI = u
+ , reqVersion = ver
+ , reqHeaders = hdrs
+ }
+
+requestLine ∷ Parser (Method, URI, HttpVersion)
+{-# INLINEABLE requestLine #-}
+requestLine = do meth ← def
+ sp
+ u ← uri
+ sp
+ ver ← def
+ crlf
+ return (meth, u, ver)
+
+uri ∷ Parser URI
+{-# INLINEABLE uri #-}
+uri = do bs ← takeWhile1 (\c → (¬) (isCtl c ∨ c ≡ '\x20'))
+ let str = C8.unpack bs
+ case parseURIReference str of
+ Nothing → fail ("Unparsable URI: " ⧺ str)
+ Just u → return u