HTTP-4000.0.9: A library for client-side HTTPSource codeContentsIndex
Network.HTTP.Base
Portabilitynon-portable (not tested)
Stabilityexperimental
MaintainerSigbjorn Finne <sigbjorn.finne@gmail.com>
Contents
Constants
HTTP
URL Encoding
URI authority parsing
Description

Definitions of Request and Response types along with functions for normalizing them. It is assumed to be an internal module; user code should, if possible, import Network.HTTP to access the functionality that this module provides.

Additionally, the module exports internal functions for working with URLs, and for handling the processing of requests and responses coming back.

Synopsis
httpVersion :: String
data Request a = Request {
rqURI :: URI
rqMethod :: RequestMethod
rqHeaders :: [Header]
rqBody :: a
}
data Response a = Response {
rspCode :: ResponseCode
rspReason :: String
rspHeaders :: [Header]
rspBody :: a
}
data RequestMethod
= HEAD
| PUT
| GET
| POST
| DELETE
| OPTIONS
| TRACE
| CONNECT
| Custom String
type Request_String = Request String
type Response_String = Response String
type HTTPRequest a = Request a
type HTTPResponse a = Response a
urlEncode :: String -> String
urlDecode :: String -> String
urlEncodeVars :: [(String, String)] -> String
data URIAuthority = URIAuthority {
user :: Maybe String
password :: Maybe String
host :: String
port :: Maybe Int
}
parseURIAuthority :: String -> Maybe URIAuthority
uriToAuthorityString :: URI -> String
uriAuthToString :: URIAuth -> String
uriAuthPort :: Maybe URI -> URIAuth -> Int
reqURIAuth :: Request ty -> URIAuth
parseResponseHead :: [String] -> Result ResponseData
parseRequestHead :: [String] -> Result RequestData
data ResponseNextStep
= Continue
| Retry
| Done
| ExpectEntity
| DieHorribly String
matchResponse :: RequestMethod -> ResponseCode -> ResponseNextStep
type ResponseData = (ResponseCode, String, [Header])
type ResponseCode = (Int, Int, Int)
type RequestData = (RequestMethod, URI, [Header])
data NormalizeRequestOptions ty = NormalizeRequestOptions {
normDoClose :: Bool
normForProxy :: Bool
normUserAgent :: Maybe String
normCustoms :: [RequestNormalizer ty]
}
defaultNormalizeRequestOptions :: NormalizeRequestOptions ty
type RequestNormalizer ty = NormalizeRequestOptions ty -> Request ty -> Request ty
normalizeRequest :: NormalizeRequestOptions ty -> Request ty -> Request ty
splitRequestURI :: URI -> (String, URI)
getAuth :: Monad m => Request ty -> m URIAuthority
normalizeRequestURI :: Bool -> String -> Request ty -> Request ty
normalizeHostHeader :: Request ty -> Request ty
findConnClose :: [Header] -> Bool
linearTransfer :: (Int -> IO (Result a)) -> Int -> IO (Result ([Header], a))
hopefulTransfer :: BufferOp a -> IO (Result a) -> [a] -> IO (Result ([Header], a))
chunkedTransfer :: BufferOp a -> IO (Result a) -> (Int -> IO (Result a)) -> IO (Result ([Header], a))
uglyDeathTransfer :: String -> IO (Result ([Header], a))
readTillEmpty1 :: BufferOp a -> IO (Result a) -> IO (Result [a])
readTillEmpty2 :: BufferOp a -> IO (Result a) -> [a] -> IO (Result [a])
defaultGETRequest :: URI -> Request_String
defaultGETRequest_ :: BufferType a => URI -> Request a
mkRequest :: BufferType ty => RequestMethod -> URI -> Request ty
defaultUserAgent :: String
libUA :: String
catchIO :: IO a -> (IOException -> IO a) -> IO a
catchIO_ :: IO a -> IO a -> IO a
responseParseError :: String -> String -> Result a
getRequestVersion :: Request a -> Maybe String
getResponseVersion :: Response a -> Maybe String
setRequestVersion :: String -> Request a -> Request a
setResponseVersion :: String -> Response a -> Response a
Constants
httpVersion :: StringSource
HTTP
data Request a Source
An HTTP Request. The Show instance of this type is used for message serialisation, which means no body data is output.
Constructors
Request
rqURI :: URImight need changing in future 1) to support * uri in OPTIONS request 2) transparent support for both relative & absolute uris, although this should already work (leave scheme & host parts empty).
rqMethod :: RequestMethod
rqHeaders :: [Header]
rqBody :: a
data Response a Source
An HTTP Response. The Show instance of this type is used for message serialisation, which means no body data is output, additionally the output will show an HTTP version of 1.1 instead of the actual version returned by a server.
Constructors
Response
rspCode :: ResponseCode
rspReason :: String
rspHeaders :: [Header]
rspBody :: a
data RequestMethod Source
The HTTP request method, to be used in the Request object. We are missing a few of the stranger methods, but these are not really necessary until we add full TLS.
Constructors
HEAD
PUT
GET
POST
DELETE
OPTIONS
TRACE
CONNECT
Custom String
type Request_String = Request StringSource
type Response_String = Response StringSource
type HTTPRequest a = Request aSource
type HTTPResponse a = Response aSource
URL Encoding
urlEncode :: String -> StringSource
urlDecode :: String -> StringSource
urlEncodeVars :: [(String, String)] -> StringSource
URI authority parsing
data URIAuthority Source
Constructors
URIAuthority
user :: Maybe String
password :: Maybe String
host :: String
port :: Maybe Int
parseURIAuthority :: String -> Maybe URIAuthoritySource

Parse the authority part of a URL.

 RFC 1732, section 3.1:

       //<user>:<password>@<host>:<port>/<url-path>
  Some or all of the parts "<user>:<password>@", ":<password>",
  ":<port>", and "/<url-path>" may be excluded.
uriToAuthorityString :: URI -> StringSource
uriAuthToString :: URIAuth -> StringSource
uriAuthPort :: Maybe URI -> URIAuth -> IntSource
reqURIAuth :: Request ty -> URIAuthSource
parseResponseHead :: [String] -> Result ResponseDataSource
parseRequestHead :: [String] -> Result RequestDataSource
data ResponseNextStep Source
Constructors
Continue
Retry
Done
ExpectEntity
DieHorribly String
matchResponse :: RequestMethod -> ResponseCode -> ResponseNextStepSource
type ResponseData = (ResponseCode, String, [Header])Source
ResponseData contains the head of a response payload; HTTP response code, accompanying text description + header fields.
type ResponseCode = (Int, Int, Int)Source
For easy pattern matching, HTTP response codes xyz are represented as (x,y,z).
type RequestData = (RequestMethod, URI, [Header])Source
RequestData contains the head of a HTTP request; method, its URL along with the auxillary/supporting header data.
data NormalizeRequestOptions ty Source
NormalizeRequestOptions brings together the various defaulting/normalization options over Requests. Use defaultNormalizeRequestOptions for the standard selection of option
Constructors
NormalizeRequestOptions
normDoClose :: Bool
normForProxy :: Bool
normUserAgent :: Maybe String
normCustoms :: [RequestNormalizer ty]
defaultNormalizeRequestOptions :: NormalizeRequestOptions tySource
type RequestNormalizer ty = NormalizeRequestOptions ty -> Request ty -> Request tySource
RequestNormalizer is the shape of a (pure) function that rewrites a request into some normalized form.
normalizeRequest :: NormalizeRequestOptions ty -> Request ty -> Request tySource
normalizeRequest opts req is the entry point to use to normalize your request prior to transmission (or other use.) Normalization is controlled via the NormalizeRequestOptions record.
splitRequestURI :: URI -> (String, URI)Source
getAuth :: Monad m => Request ty -> m URIAuthoritySource
getAuth req fishes out the authority portion of the URL in a request's Host header.
normalizeRequestURI :: Bool -> String -> Request ty -> Request tySource
normalizeHostHeader :: Request ty -> Request tySource
findConnClose :: [Header] -> BoolSource
linearTransfer :: (Int -> IO (Result a)) -> Int -> IO (Result ([Header], a))Source
Used when we know exactly how many bytes to expect.
hopefulTransfer :: BufferOp a -> IO (Result a) -> [a] -> IO (Result ([Header], a))Source
Used when nothing about data is known, Unfortunately waiting for a socket closure causes bad behaviour. Here we just take data once and give up the rest.
chunkedTransfer :: BufferOp a -> IO (Result a) -> (Int -> IO (Result a)) -> IO (Result ([Header], a))Source
A necessary feature of HTTP/1.1 Also the only transfer variety likely to return any footers.
uglyDeathTransfer :: String -> IO (Result ([Header], a))Source
Maybe in the future we will have a sensible thing to do here, at that time we might want to change the name.
readTillEmpty1 :: BufferOp a -> IO (Result a) -> IO (Result [a])Source
Remove leading crlfs then call readTillEmpty2 (not required by RFC)
readTillEmpty2 :: BufferOp a -> IO (Result a) -> [a] -> IO (Result [a])Source
Read lines until an empty line (CRLF), also accepts a connection close as end of input, which is not an HTTP/1.1 compliant thing to do - so probably indicates an error condition.
defaultGETRequest :: URI -> Request_StringSource
defaultGETRequest_ :: BufferType a => URI -> Request aSource
mkRequest :: BufferType ty => RequestMethod -> URI -> Request tySource
'mkRequest method uri' constructs a well formed request for the given HTTP method and URI. It does not normalize the URI for the request _nor_ add the required Host: header. That is done either explicitly by the user or when requests are normalized prior to transmission.
defaultUserAgent :: StringSource
libUA :: StringSource
catchIO :: IO a -> (IOException -> IO a) -> IO aSource
catchIO a h handles IO action exceptions throughout codebase; version-specific tweaks better go here.
catchIO_ :: IO a -> IO a -> IO aSource
responseParseError :: String -> String -> Result aSource
getRequestVersion :: Request a -> Maybe StringSource
getRequestVersion req returns the HTTP protocol version of the request req. If Nothing, the default httpVersion can be assumed.
getResponseVersion :: Response a -> Maybe StringSource
getResponseVersion rsp returns the HTTP protocol version of the response rsp. If Nothing, the default httpVersion can be assumed.
setRequestVersion :: String -> Request a -> Request aSource
setRequestVersion v req returns a new request, identical to req, but with its HTTP version set to v.
setResponseVersion :: String -> Response a -> Response aSource
setResponseVersion v rsp returns a new response, identical to rsp, but with its HTTP version set to v.
Produced by Haddock version 2.6.0