module Network.HTTP.Dispatch.Types where
import qualified Data.ByteString as S
import qualified Data.ByteString.Char8 as SC
type Url = String
type Header = (S.ByteString, S.ByteString)
type Headers = [Header]
type Body = S.ByteString
data HTTPRequestMethod =
HEAD
| GET
| POST
| PUT
| PATCH
| DELETE
| TRACE
| OPTIONS
| CONNECT deriving ( Eq, Show )
data HTTPRequest = HTTPRequest {
reqMethod :: HTTPRequestMethod
, reqUrl :: String
, reqHeaders :: [Header]
, reqBody :: Maybe S.ByteString
} deriving ( Eq, Show )
data HTTPResponse = HTTPResponse {
respStatus :: Int
, respHeaders :: [Header]
, respBody :: S.ByteString
} deriving ( Eq, Show )
header :: String -> String -> Header
header k v = (SC.pack k , SC.pack v)
transformHeaders :: [(String, String)] -> [Header]
transformHeaders = map (\(k,v) -> header k v)
withHeader :: HTTPRequest -> Header -> HTTPRequest
withHeader req header = req { reqHeaders = header : (reqHeaders req) }
withHeaders :: HTTPRequest -> [Header] -> HTTPRequest
withHeaders req headers = req { reqHeaders = headers }
withBody :: HTTPRequest -> S.ByteString -> HTTPRequest
withBody req body = req { reqBody = Just body }
withMethod :: HTTPRequest -> HTTPRequestMethod -> HTTPRequest
withMethod req method = req { reqMethod = method }
dropHeaderWithKey :: HTTPRequest -> S.ByteString -> HTTPRequest
dropHeaderWithKey req@(HTTPRequest _ _ hdrs _) headerKey =
let filteredHeaders = filter (\(k,v) -> k /= headerKey) hdrs in
withHeaders req filteredHeaders