6 -- |Definition of things related on HTTP request.
8 -- In general you don't have to use this module directly.
9 module Network.HTTP.Lucu.Request
16 import Control.Applicative
17 import Control.Monad.Unicode
18 import Data.Ascii (Ascii)
19 import Data.Attoparsec.Char8
20 import qualified Data.ByteString.Char8 as C8
21 import Network.HTTP.Lucu.Headers
22 import Network.HTTP.Lucu.HttpVersion
23 import Network.HTTP.Lucu.Parser.Http
25 import Prelude.Unicode
27 -- |This is the definition of HTTP request methods, which shouldn't
28 -- require any description.
37 | ExtensionMethod !Ascii
40 -- |This is the definition of HTTP reqest.
45 , reqVersion ∷ !HttpVersion
46 , reqHeaders ∷ !Headers
50 instance HasHeaders Request where
51 {-# INLINE getHeaders #-}
52 getHeaders = reqHeaders
53 {-# INLINE setHeaders #-}
54 setHeaders req hdr = req { reqHeaders = hdr }
56 -- |Returns 'True' iff the 'Request' must have an entity body.
57 reqMustHaveBody ∷ Request → Bool
58 {-# INLINEABLE reqMustHaveBody #-}
59 reqMustHaveBody (reqMethod → m)
64 requestP ∷ Parser Request
65 requestP = do skipMany crlf
66 (method, uri, version) ← requestLineP
71 , reqVersion = version
72 , reqHeaders = headers
75 requestLineP ∷ Parser (Method, URI, HttpVersion)
76 requestLineP = do method ← methodP
82 return (method, uri, ver)
84 methodP ∷ Parser Method
86 [ string "OPTIONS" ≫ return OPTIONS
87 , string "GET" ≫ return GET
88 , string "HEAD" ≫ return HEAD
89 , string "POST" ≫ return POST
90 , string "PUT" ≫ return PUT
91 , string "DELETE" ≫ return DELETE
92 , string "TRACE" ≫ return TRACE
93 , string "CONNECT" ≫ return CONNECT
94 , ExtensionMethod <$> token
98 uriP = do bs ← takeWhile1 (\c → (¬) (isCtl c ∨ c ≡ '\x20'))
99 let str = C8.unpack bs
100 case parseURIReference str of
101 Nothing -> fail ("Unparsable URI: " ⧺ str)
102 Just uri -> return uri