, UnicodeSyntax
, ViewPatterns
#-}
--- |Definition of things related on HTTP request.
---
--- In general you don't have to use this module directly.
+-- |Definition of HTTP requests.
module Network.HTTP.Lucu.Request
( Method(..)
, Request(..)
import Network.URI
import Prelude.Unicode
--- |This is the definition of HTTP request methods, which shouldn't
--- require any descriptions.
+-- |Definition of HTTP request methods.
data Method = OPTIONS
| GET
| HEAD
| ExtensionMethod !Ascii
deriving (Eq, Show)
--- |This is the definition of an HTTP reqest.
+-- |Definition of HTTP requests.
data Request
= Request {
reqMethod ∷ !Method
| m ≡ PUT = True
| otherwise = False
+instance Default (Parser Method) where
+ {-# INLINEABLE def #-}
+ def = choice
+ [ string "OPTIONS" ≫ return OPTIONS
+ , string "GET" ≫ return GET
+ , string "HEAD" ≫ return HEAD
+ , string "POST" ≫ return POST
+ , string "PUT" ≫ return PUT
+ , string "DELETE" ≫ return DELETE
+ , string "TRACE" ≫ return TRACE
+ , string "CONNECT" ≫ return CONNECT
+ , ExtensionMethod <$> token
+ ]
+
instance Default (Parser Request) where
{-# INLINEABLE def #-}
def = do skipMany crlf
requestLine ∷ Parser (Method, URI, HttpVersion)
{-# INLINEABLE requestLine #-}
-requestLine = do meth ← method
+requestLine = do meth ← def
sp
u ← uri
sp
crlf
return (meth, u, ver)
-method ∷ Parser Method
-{-# INLINEABLE method #-}
-method = choice
- [ string "OPTIONS" ≫ return OPTIONS
- , string "GET" ≫ return GET
- , string "HEAD" ≫ return HEAD
- , string "POST" ≫ return POST
- , string "PUT" ≫ return PUT
- , string "DELETE" ≫ return DELETE
- , string "TRACE" ≫ return TRACE
- , string "CONNECT" ≫ return CONNECT
- , ExtensionMethod <$> token
- ]
-
uri ∷ Parser URI
{-# INLINEABLE uri #-}
uri = do bs ← takeWhile1 (\c → (¬) (isCtl c ∨ c ≡ '\x20'))