HTTP-4000.0.4: A library for client-side HTTPContentsIndex
Network.HTTP.Base
Portabilitynon-portable (not tested)
Stabilityexperimental
MaintainerSigbjorn Finne <sigbjorn.finne@gmail.com>
Contents
Constants
HTTP
URL Encoding
URI authority parsing
Description
An easy HTTP interface; base types.
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
type Request_String = Request String
type Response_String = Response String
type HTTPRequest a = Request a
type HTTPResponse a = Response a
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
sp :: String
uriToAuthorityString :: URI -> String
uriAuthToString :: URIAuth -> String
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])
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])
catchIO :: IO a -> (IOException -> IO a) -> IO a
catchIO_ :: IO a -> IO a -> IO a
responseParseError :: String -> String -> Result a
Constants
httpVersion :: String
HTTP
data Request a
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
show/hide Instances
data Response a
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
show/hide Instances
data RequestMethod
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
show/hide Instances
type Request_String = Request String
type Response_String = Response String
type HTTPRequest a = Request a
type HTTPResponse a = Response a
URL Encoding
urlDecode :: String -> String
urlEncodeVars :: [(String, String)] -> String
URI authority parsing
data URIAuthority
Constructors
URIAuthority
user :: Maybe String
password :: Maybe String
host :: String
port :: Maybe Int
show/hide Instances
parseURIAuthority :: String -> Maybe URIAuthority

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.
sp :: String
uriToAuthorityString :: URI -> String
uriAuthToString :: URIAuth -> String
parseResponseHead :: [String] -> Result ResponseData
parseRequestHead :: [String] -> Result RequestData
data ResponseNextStep
Constructors
Continue
Retry
Done
ExpectEntity
DieHorribly String
matchResponse :: RequestMethod -> ResponseCode -> ResponseNextStep
type ResponseData = (ResponseCode, String, [Header])
ResponseData contains the head of a response payload; HTTP response code, accompanying text description + header fields.
type ResponseCode = (Int, Int, Int)
For easy pattern matching, HTTP response codes xyz are represented as (x,y,z).
type RequestData = (RequestMethod, URI, [Header])
RequestData contains the head of a HTTP request; method, its URL along with the auxillary/supporting header data.
getAuth :: Monad m => Request ty -> m URIAuthority
getAuth req fishes out the authority portion of the URL in a request's Host header.
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))
Used when we know exactly how many bytes to expect.
hopefulTransfer :: BufferOp a -> IO (Result a) -> [a] -> IO (Result ([Header], a))
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))
A necessary feature of HTTP/1.1 Also the only transfer variety likely to return any footers.
uglyDeathTransfer :: String -> IO (Result ([Header], a))
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])
Remove leading crlfs then call readTillEmpty2 (not required by RFC)
readTillEmpty2 :: BufferOp a -> IO (Result a) -> [a] -> IO (Result [a])
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.
catchIO :: IO a -> (IOException -> IO a) -> IO a
catchIO a h handles IO action exceptions throughout codebase; version-specific tweaks better go here.
catchIO_ :: IO a -> IO a -> IO a
responseParseError :: String -> String -> Result a
Produced by Haddock version 2.3.0