3 , MultiParamTypeClasses
9 -- |Definition of things related on HTTP request.
11 -- In general you don't have to use this module directly.
12 module Network.HTTP.Lucu.Request
18 import Control.Applicative
19 import Control.Monad.Unicode
20 import Data.Ascii (Ascii)
21 import Data.Attoparsec.Char8
22 import qualified Data.ByteString.Char8 as C8
24 import Network.HTTP.Lucu.Headers
25 import Network.HTTP.Lucu.HttpVersion
26 import Network.HTTP.Lucu.Parser.Http
28 import Prelude.Unicode
30 -- |This is the definition of HTTP request methods, which shouldn't
31 -- require any descriptions.
40 | ExtensionMethod !Ascii
43 -- |This is the definition of an HTTP reqest.
48 , reqVersion ∷ !HttpVersion
49 , reqHeaders ∷ !Headers
53 instance HasHeaders Request where
54 {-# INLINE getHeaders #-}
55 getHeaders = reqHeaders
56 {-# INLINE setHeaders #-}
57 setHeaders req hdr = req { reqHeaders = hdr }
59 -- |Returns 'True' iff the 'Request' would have an entity body.
60 reqHasBody ∷ Request → Bool
61 {-# INLINEABLE reqHasBody #-}
62 reqHasBody (reqMethod → m)
67 instance Default (Parser Request) where
68 {-# INLINEABLE def #-}
69 def = do skipMany crlf
70 (meth, u, ver) ← requestLine
79 requestLine ∷ Parser (Method, URI, HttpVersion)
80 {-# INLINEABLE requestLine #-}
81 requestLine = do meth ← method
89 method ∷ Parser Method
90 {-# INLINEABLE method #-}
92 [ string "OPTIONS" ≫ return OPTIONS
93 , string "GET" ≫ return GET
94 , string "HEAD" ≫ return HEAD
95 , string "POST" ≫ return POST
96 , string "PUT" ≫ return PUT
97 , string "DELETE" ≫ return DELETE
98 , string "TRACE" ≫ return TRACE
99 , string "CONNECT" ≫ return CONNECT
100 , ExtensionMethod <$> token
104 {-# INLINEABLE uri #-}
105 uri = do bs ← takeWhile1 (\c → (¬) (isCtl c ∨ c ≡ '\x20'))
106 let str = C8.unpack bs
107 case parseURIReference str of
108 Nothing → fail ("Unparsable URI: " ⧺ str)