-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | An HTTP client engine, intended as a base layer for more user-friendly packages. -- -- Hackage documentation generation is not reliable. For up to date -- documentation, please see: -- http://www.stackage.org/package/http-client. @package http-client @version 0.4.7 -- | Note that this is essentially the "kitchen sink" export module, -- including many functions intended only to be used internally by this -- package. No API stability is guaranteed for this module. If you see -- functions here which you believe should be promoted to a stable API, -- please contact the author. module Network.HTTP.Client.Internal makeChunkedReader :: Bool -> Connection -> IO BodyReader makeLengthReader :: Int -> Connection -> IO BodyReader makeGzipReader :: BodyReader -> IO BodyReader makeUnlimitedReader :: Connection -> IO BodyReader -- | Strictly consume all remaining chunks of data from the stream. -- -- Since 0.1.0 brConsume :: BodyReader -> IO [ByteString] brEmpty :: BodyReader brAddCleanup :: IO () -> BodyReader -> BodyReader brReadSome :: BodyReader -> Int -> IO ByteString -- | Get a single chunk of data from the response body, or an empty -- bytestring if no more data is available. -- -- Since 0.1.0 brRead :: BodyReader -> IO ByteString connectionReadLine :: Connection -> IO ByteString connectionReadLineWith :: Connection -> ByteString -> IO ByteString -- | Keep dropping input until a blank line is found. connectionDropTillBlankLine :: Connection -> IO () -- | For testing dummyConnection :: [ByteString] -> IO (Connection, IO [ByteString], IO [ByteString]) openSocketConnection :: (Socket -> IO ()) -> Maybe HostAddress -> String -> Int -> IO Connection openSocketConnectionSize :: (Socket -> IO ()) -> Int -> Maybe HostAddress -> String -> Int -> IO Connection makeConnection :: IO ByteString -> (ByteString -> IO ()) -> IO () -> IO Connection -- | This applies receiveSetCookie to a given Response updateCookieJar :: Response a -> Request -> UTCTime -> CookieJar -> (CookieJar, Response a) -- | This corresponds to the algorithm described in Section 5.3 "Storage -- Model" This function consists of calling generateCookie -- followed by insertCheckedCookie. Use this function if you plan -- to do both in a row. generateCookie and -- insertCheckedCookie are only provided for more fine-grained -- control. receiveSetCookie :: SetCookie -> Request -> UTCTime -> Bool -> CookieJar -> CookieJar -- | Turn a SetCookie into a Cookie, if it is valid generateCookie :: SetCookie -> Request -> UTCTime -> Bool -> Maybe Cookie -- | Insert a cookie created by generateCookie into the cookie jar (or not -- if it shouldn't be allowed in) insertCheckedCookie :: Cookie -> CookieJar -> Bool -> CookieJar -- | This applies the computeCookieString to a given Request insertCookiesIntoRequest :: Request -> CookieJar -> UTCTime -> (Request, CookieJar) -- | This corresponds to the algorithm described in Section 5.4 "The Cookie -- Header" computeCookieString :: Request -> CookieJar -> UTCTime -> Bool -> (ByteString, CookieJar) -- | This corresponds to the eviction algorithm described in Section 5.3 -- "Storage Model" evictExpiredCookies :: CookieJar -> UTCTime -> CookieJar createCookieJar :: [Cookie] -> CookieJar destroyCookieJar :: CookieJar -> [Cookie] -- | This corresponds to the subcomponent algorithm entitled "Path-Match" -- detailed in section 5.1.4 pathMatches :: ByteString -> ByteString -> Bool removeExistingCookieFromCookieJar :: Cookie -> CookieJar -> (Maybe Cookie, CookieJar) -- | This corresponds to the subcomponent algorithm entitled "Domain -- Matching" detailed in section 5.1.3 domainMatches :: ByteString -> ByteString -> Bool isIpAddress :: ByteString -> Bool -- | This corresponds to the subcomponent algorithm entitled "Paths" -- detailed in section 5.1.4 defaultPath :: Request -> ByteString -- | Perform a Request using a connection acquired from the given -- Manager, and then provide the Response to the given -- function. This function is fully exception safe, guaranteeing that the -- response will be closed when the inner function exits. It is defined -- as: -- --
-- withResponse req man f = bracket (responseOpen req man) responseClose f ---- -- It is recommended that you use this function in place of explicit -- calls to responseOpen and responseClose. -- -- You will need to use functions such as brRead to consume the -- response body. -- -- Since 0.1.0 withResponse :: Request -> Manager -> (Response BodyReader -> IO a) -> IO a -- | A convenience wrapper around withResponse which reads in the -- entire response body and immediately closes the connection. Note that -- this function performs fully strict I/O, and only uses a lazy -- ByteString in its response for memory efficiency. If you are -- anticipating a large response body, you are encouraged to use -- withResponse and brRead instead. -- -- Since 0.1.0 httpLbs :: Request -> Manager -> IO (Response ByteString) -- | A convenient wrapper around withResponse which ignores the -- response body. This is useful, for example, when performing a HEAD -- request. -- -- Since 0.3.2 httpNoBody :: Request -> Manager -> IO (Response ()) -- | Get a Response without any redirect following. httpRaw :: Request -> Manager -> IO (Response BodyReader) -- | The most low-level function for initiating an HTTP request. -- -- The first argument to this function gives a full specification on the -- request: the host to connect to, whether to use SSL, headers, etc. -- Please see Request for full details. The second argument -- specifies which Manager should be used. -- -- This function then returns a Response with a BodyReader. -- The Response contains the status code and headers that were -- sent back to us, and the BodyReader contains the body of the -- request. Note that this BodyReader allows you to have fully -- interleaved IO actions during your HTTP download, making it possible -- to download very large responses in constant memory. -- -- An important note: the response body returned by this function -- represents a live HTTP connection. As such, if you do not use the -- response body, an open socket will be retained indefinitely. You must -- be certain to call responseClose on this response to free up -- resources. -- -- This function automatically performs any necessary redirects, as -- specified by the redirectCount setting. -- -- When implementing a (reverse) proxy using this function or relating -- functions, it's wise to remove Transfer-Encoding:, Content-Length:, -- Content-Encoding: and Accept-Encoding: from request and response -- headers to be relayed. -- -- Since 0.1.0 responseOpen :: Request -> Manager -> IO (Response BodyReader) -- | Close any open resources associated with the given Response. -- In general, this will either close an active Connection or -- return it to the Manager to be reused. -- -- Since 0.1.0 responseClose :: Response a -> IO () -- | Apply 'Request'\'s checkStatus and return resulting exception -- if any. applyCheckStatus :: Request -> (Status -> ResponseHeaders -> CookieJar -> Maybe SomeException) -> Response BodyReader -> IO (Maybe SomeException) -- | Redirect loop httpRedirect :: Int -> (Request -> IO (Response BodyReader, Maybe Request)) -> Request -> IO (Response BodyReader) parseStatusHeaders :: Connection -> IO StatusHeaders -- | Convert a URL into a Request. -- -- This defaults some of the values in Request, such as setting -- method to GET and requestHeaders to []. -- -- Since this function uses MonadThrow, the return monad can be -- anything that is an instance of MonadThrow, such as IO -- or Maybe. -- -- Since 0.1.0 parseUrl :: MonadThrow m => String -> m Request -- | Add a URI to the request. If it is absolute (includes a host -- name), add it as per setUri; if it is relative, merge it with -- the existing request. setUriRelative :: MonadThrow m => Request -> URI -> m Request -- | Extract a URI from the request. -- -- Since 0.1.0 getUri :: Request -> URI -- | Validate a URI, then add it to the request. setUri :: MonadThrow m => Request -> URI -> m Request -- | Decompress a compressed stream unless the content-type is -- 'application/x-tar'. browserDecompress :: ByteString -> Bool -- | Always decompress a compressed stream. alwaysDecompress :: ByteString -> Bool -- | Add a proxy to the Request so that the Request when executed will use -- the provided proxy. -- -- Since 0.1.0 addProxy :: ByteString -> Int -> Request -> Request -- | Add a Basic Auth header (with the specified user name and password) to -- the given Request. Ignore error handling: -- --
-- applyBasicAuth "user" "pass" $ fromJust $ parseUrl url ---- -- Since 0.1.0 applyBasicAuth :: ByteString -> ByteString -> Request -> Request -- | Add a Proxy-Authorization header (with the specified username and -- password) to the given Request. Ignore error handling: -- --
-- applyBasicProxyAuth "user" "pass" <$> parseUrl "http://example.org" ---- -- Since 0.3.4 applyBasicProxyAuth :: ByteString -> ByteString -> Request -> Request -- | Add url-encoded parameters to the Request. -- -- This sets a new requestBody, adds a content-type request header -- and changes the method to POST. -- -- Since 0.1.0 urlEncodedBody :: [(ByteString, ByteString)] -> Request -> Request needsGunzip :: Request -> [Header] -> Bool requestBuilder :: Request -> Connection -> IO () -- | Magic value to be placed in a Request to indicate that we -- should use the timeout value in the Manager. -- -- Since 1.9.3 useDefaultTimeout :: Maybe Int -- | Set the query string to the given key/value pairs. -- -- Since 0.3.6 setQueryString :: [(ByteString, Maybe ByteString)] -> Request -> Request -- | If a request is a redirection (status code 3xx) this function will -- create a new request from the old request, the server headers returned -- with the redirection, and the redirection code itself. This function -- returns Nothing if the code is not a 3xx, there is no -- location header included, or if the redirected response -- couldn't be parsed with parseUrl. -- -- If a user of this library wants to know the url chain that results -- from a specific request, that user has to re-implement the -- redirect-following logic themselves. An example of that might look -- like this: -- --
-- myHttp req man = do
-- (res, redirectRequests) <- (`runStateT` []) $
-- 'httpRedirect'
-- 9000
-- (\req' -> do
-- res <- http req'{redirectCount=0} man
-- modify (\rqs -> req' : rqs)
-- return (res, getRedirectedRequest req' (responseHeaders res) (responseCookieJar res) (W.statusCode (responseStatus res))
-- )
-- 'lift'
-- req
-- applyCheckStatus (checkStatus req) res
-- return redirectRequests
--
getRedirectedRequest :: Request -> ResponseHeaders -> CookieJar -> Int -> Maybe Request
getResponse :: ConnRelease -> Maybe Int -> Request -> Connection -> IO (Response BodyReader)
-- | Convert a Response that has a Source body to one with
-- a lazy ByteString body.
lbsResponse :: Response BodyReader -> IO (Response ByteString)
-- | Settings for a Manager. Please use the
-- defaultManagerSettings function and then modify individual
-- settings. For more information, see
-- http://www.yesodweb.com/book/settings-types.
--
-- Since 0.1.0
data ManagerSettings
ManagerSettings :: Int -> IO (Maybe HostAddress -> String -> Int -> IO Connection) -> IO (Maybe HostAddress -> String -> Int -> IO Connection) -> IO (ByteString -> (Connection -> IO ()) -> String -> Maybe HostAddress -> String -> Int -> IO Connection) -> Maybe Int -> (SomeException -> Bool) -> (forall a. IO a -> IO a) -> Int -> (Request -> IO Request) -> ProxyOverride -> ProxyOverride -> ManagerSettings
-- | Number of connections to a single host to keep alive. Default: 10.
--
-- Since 0.1.0
managerConnCount :: ManagerSettings -> Int
-- | Create an insecure connection.
--
-- Since 0.1.0 FIXME in the future, combine managerTlsConnection and
-- managerTlsProxyConnection
managerRawConnection :: ManagerSettings -> IO (Maybe HostAddress -> String -> Int -> IO Connection)
-- | Create a TLS connection. Default behavior: throw an exception that TLS
-- is not supported.
--
-- Since 0.1.0
managerTlsConnection :: ManagerSettings -> IO (Maybe HostAddress -> String -> Int -> IO Connection)
-- | Create a TLS proxy connection. Default behavior: throw an exception
-- that TLS is not supported.
--
-- Since 0.2.2
managerTlsProxyConnection :: ManagerSettings -> IO (ByteString -> (Connection -> IO ()) -> String -> Maybe HostAddress -> String -> Int -> IO Connection)
-- | Default timeout (in microseconds) to be applied to requests which do
-- not provide a timeout value.
--
-- Default is 30 seconds
--
-- Since 0.1.0
managerResponseTimeout :: ManagerSettings -> Maybe Int
-- | Exceptions for which we should retry our request if we were reusing an
-- already open connection. In the case of IOExceptions, for example, we
-- assume that the connection was closed on the server and therefore open
-- a new one.
--
-- Since 0.1.0
managerRetryableException :: ManagerSettings -> SomeException -> Bool
-- | Action wrapped around all attempted Requests, usually used to
-- wrap up exceptions in library-specific types.
--
-- Default: wrap all IOExceptions in the
-- InternalIOException constructor.
--
-- Since 0.1.0
managerWrapIOException :: ManagerSettings -> forall a. IO a -> IO a
-- | Total number of idle connection to keep open at a given time.
--
-- This limit helps deal with the case where you are making a large
-- number of connections to different hosts. Without this limit, you
-- could run out of file descriptors.
--
-- Default: 512
--
-- Since 0.3.7
managerIdleConnectionCount :: ManagerSettings -> Int
-- | Perform the given modification to a Request before performing
-- it.
--
-- Default: no modification
--
-- Since 0.4.4
managerModifyRequest :: ManagerSettings -> Request -> IO Request
-- | How HTTP proxy server settings should be discovered.
--
-- Default: respect the proxy value on the Request
-- itself.
--
-- Since 0.4.7
managerProxyInsecure :: ManagerSettings -> ProxyOverride
-- | How HTTPS proxy server settings should be discovered.
--
-- Default: respect the proxy value on the Request
-- itself.
--
-- Since 0.4.7
managerProxySecure :: ManagerSettings -> ProxyOverride
-- | Create a Manager. You may manually call closeManager to
-- shut it down, or allow the Manager to be shut down
-- automatically based on garbage collection.
--
-- Creating a new Manager is a relatively expensive operation, you
-- are advised to share a single Manager between requests instead.
--
-- The first argument to this function is often
-- defaultManagerSettings, though add-on libraries may provide a
-- recommended replacement.
--
-- Since 0.1.0
newManager :: ManagerSettings -> IO Manager
-- | Close all connections in a Manager.
--
-- Note that this doesn't affect currently in-flight connections, meaning
-- you can safely use it without hurting any queries you may have
-- concurrently running.
--
-- Since 0.1.0
closeManager :: Manager -> IO ()
-- | Create, use and close a Manager.
--
-- Since 0.2.1
withManager :: ManagerSettings -> (Manager -> IO a) -> IO a
getConn :: Request -> Manager -> IO (ConnRelease, Connection, ManagedConn)
-- | Create an exception to be thrown if the connection for the given
-- request fails.
failedConnectionException :: Request -> HttpException
-- | Default value for ManagerSettings.
--
-- Note that this value does not have support for SSL/TLS. If you
-- need to make any https connections, please use the http-client-tls
-- package, which provides a tlsManagerSettings value.
--
-- Since 0.1.0
defaultManagerSettings :: ManagerSettings
-- | A value for the managerRawConnection setting, but also allows
-- you to modify the underlying Socket to set additional
-- settings. For a motivating use case, see:
-- https://github.com/snoyberg/http-client/issues/71.
--
-- Since 0.3.8
rawConnectionModifySocket :: (Socket -> IO ()) -> IO (Maybe HostAddress -> String -> Int -> IO Connection)
-- | Get the proxy settings from the Request itself.
--
-- Since 0.4.7
proxyFromRequest :: ProxyOverride
-- | Never connect using a proxy, regardless of the proxy value in the
-- Request.
--
-- Since 0.4.7
noProxy :: ProxyOverride
-- | Use the given proxy settings, regardless of the proxy value in the
-- Request.
--
-- Since 0.4.7
useProxy :: Proxy -> ProxyOverride
-- | Get the proxy settings from the default environment variable
-- (http_proxy for insecure, https_proxy for secure).
-- If no variable is set, then fall back to the given value.
-- Nothing is equivalent to noProxy, Just is
-- equivalent to useProxy.
--
-- Since 0.4.7
proxyEnvironment :: Maybe Proxy -> ProxyOverride
-- | Same as proxyEnvironment, but instead of default environment
-- variable names, allows you to set your own name.
--
-- Since 0.4.7
proxyEnvironmentNamed :: Text -> Maybe Proxy -> ProxyOverride
-- | The default proxy settings for a manager. In particular: if the
-- http_proxy (or https_proxy) environment variable is
-- set, use it. Otherwise, use the values in the Request.
--
-- Since 0.4.7
defaultProxy :: ProxyOverride
-- | An IO action that represents an incoming response body coming
-- from the server. Data provided by this action has already been
-- gunzipped and de-chunked, and respects any content-length headers
-- present.
--
-- The action gets a single chunk of data from the response body, or an
-- empty bytestring if no more data is available.
--
-- Since 0.4.0
type BodyReader = IO ByteString
data Connection
Connection :: IO ByteString -> (ByteString -> IO ()) -> (ByteString -> IO ()) -> IO () -> Connection
-- | If no more data, return empty.
connectionRead :: Connection -> IO ByteString
-- | Return data to be read next time.
connectionUnread :: Connection -> ByteString -> IO ()
-- | Send data to server
connectionWrite :: Connection -> ByteString -> IO ()
connectionClose :: Connection -> IO ()
data StatusHeaders
StatusHeaders :: Status -> HttpVersion -> RequestHeaders -> StatusHeaders
data HttpException
StatusCodeException :: Status -> ResponseHeaders -> CookieJar -> HttpException
InvalidUrlException :: String -> String -> HttpException
-- | List of encountered responses containing redirects in reverse
-- chronological order; including last redirect, which triggered the
-- exception and was not followed.
TooManyRedirects :: [Response ByteString] -> HttpException
-- | Response containing unparseable redirect.
UnparseableRedirect :: (Response ByteString) -> HttpException
TooManyRetries :: HttpException
HttpParserException :: String -> HttpException
HandshakeFailed :: HttpException
OverlongHeaders :: HttpException
ResponseTimeout :: HttpException
-- | host/port
FailedConnectionException :: String -> Int -> HttpException
-- | hostportsecure
FailedConnectionException2 :: String -> Int -> Bool -> SomeException -> HttpException
ExpectedBlankAfter100Continue :: HttpException
InvalidStatusLine :: ByteString -> HttpException
InvalidHeader :: ByteString -> HttpException
InternalIOException :: IOException -> HttpException
-- | host/port
ProxyConnectException :: ByteString -> Int -> (Either ByteString HttpException) -> HttpException
NoResponseDataReceived :: HttpException
TlsException :: SomeException -> HttpException
TlsNotSupported :: HttpException
-- | Expected size/actual size.
--
-- Since 1.9.4
ResponseBodyTooShort :: Word64 -> Word64 -> HttpException
-- | Since 1.9.4
InvalidChunkHeaders :: HttpException
IncompleteHeaders :: HttpException
InvalidDestinationHost :: ByteString -> HttpException
-- | Since 0.3
HttpZlibException :: ZlibException -> HttpException
-- | Environment name and value
--
-- Since 0.4.7
InvalidProxyEnvironmentVariable :: Text -> Text -> HttpException
data Cookie
Cookie :: ByteString -> ByteString -> UTCTime -> ByteString -> ByteString -> UTCTime -> UTCTime -> Bool -> Bool -> Bool -> Bool -> Cookie
cookie_name :: Cookie -> ByteString
cookie_value :: Cookie -> ByteString
cookie_expiry_time :: Cookie -> UTCTime
cookie_domain :: Cookie -> ByteString
cookie_path :: Cookie -> ByteString
cookie_creation_time :: Cookie -> UTCTime
cookie_last_access_time :: Cookie -> UTCTime
cookie_persistent :: Cookie -> Bool
cookie_host_only :: Cookie -> Bool
cookie_secure_only :: Cookie -> Bool
cookie_http_only :: Cookie -> Bool
newtype CookieJar
CJ :: [Cookie] -> CookieJar
expose :: CookieJar -> [Cookie]
-- | Define a HTTP proxy, consisting of a hostname and port number.
data Proxy
Proxy :: ByteString -> Int -> Proxy
-- | The host name of the HTTP proxy.
proxyHost :: Proxy -> ByteString
-- | The port number of the HTTP proxy.
proxyPort :: Proxy -> Int
-- | When using one of the RequestBodyStream /
-- RequestBodyStreamChunked constructors, you must ensure that the
-- GivesPopper can be called multiple times. Usually this is not a
-- problem.
--
-- The RequestBodyStreamChunked will send a chunked request body.
-- Note that not all servers support this. Only use
-- RequestBodyStreamChunked if you know the server you're sending
-- to supports chunked request bodies.
--
-- Since 0.1.0
data RequestBody
RequestBodyLBS :: ByteString -> RequestBody
RequestBodyBS :: ByteString -> RequestBody
RequestBodyBuilder :: Int64 -> Builder -> RequestBody
RequestBodyStream :: Int64 -> (GivesPopper ()) -> RequestBody
RequestBodyStreamChunked :: (GivesPopper ()) -> RequestBody
-- | A function which generates successive chunks of a request body,
-- provider a single empty bytestring when no more data is available.
--
-- Since 0.1.0
type Popper = IO ByteString
-- | A function which must be provided with a Popper.
--
-- Since 0.1.0
type NeedsPopper a = Popper -> IO a
-- | A function which will provide a Popper to a NeedsPopper.
-- This seemingly convoluted structure allows for creation of request
-- bodies which allocate scarce resources in an exception safe manner.
--
-- Since 0.1.0
type GivesPopper a = NeedsPopper a -> IO a
-- | All information on how to connect to a host and what should be sent in
-- the HTTP request.
--
-- If you simply wish to download from a URL, see parseUrl.
--
-- The constructor for this data type is not exposed. Instead, you should
-- use either the def method to retrieve a default instance, or
-- parseUrl to construct from a URL, and then use the records
-- below to make modifications. This approach allows http-client to add
-- configuration options without breaking backwards compatibility.
--
-- For example, to construct a POST request, you could do something like:
--
--
-- initReq <- parseUrl "http://www.example.com/path"
-- let req = initReq
-- { method = "POST"
-- }
--
--
-- For more information, please see
-- http://www.yesodweb.com/book/settings-types.
--
-- Since 0.1.0
data Request
Request :: Method -> Bool -> ByteString -> Int -> ByteString -> ByteString -> RequestHeaders -> RequestBody -> Maybe Proxy -> Maybe HostAddress -> Bool -> (ByteString -> Bool) -> Int -> (Status -> ResponseHeaders -> CookieJar -> Maybe SomeException) -> Maybe Int -> (Maybe Int -> HttpException -> IO (ConnRelease, Connection, ManagedConn) -> IO (Maybe Int, (ConnRelease, Connection, ManagedConn))) -> Maybe CookieJar -> HttpVersion -> (SomeException -> IO ()) -> Request
-- | HTTP request method, eg GET, POST.
--
-- Since 0.1.0
method :: Request -> Method
-- | Whether to use HTTPS (ie, SSL).
--
-- Since 0.1.0
secure :: Request -> Bool
-- | Requested host name, used for both the IP address to connect to and
-- the host request header.
--
-- Since 0.1.0
host :: Request -> ByteString
-- | The port to connect to. Also used for generating the host
-- request header.
--
-- Since 0.1.0
port :: Request -> Int
-- | Everything from the host to the query string.
--
-- Since 0.1.0
path :: Request -> ByteString
-- | Query string appended to the path.
--
-- Since 0.1.0
queryString :: Request -> ByteString
-- | Custom HTTP request headers
--
-- The Content-Length and Transfer-Encoding headers are set automatically
-- by this module, and shall not be added to requestHeaders.
--
-- If not provided by the user, Host will automatically be set
-- based on the host and port fields.
--
-- Moreover, the Accept-Encoding header is set implicitly to gzip for
-- convenience by default. This behaviour can be overridden if needed, by
-- setting the header explicitly to a different value. In order to omit
-- the Accept-Header altogether, set it to the empty string "". If you
-- need an empty Accept-Header (i.e. requesting the identity encoding),
-- set it to a non-empty white-space string, e.g. " ". See RFC 2616
-- section 14.3 for details about the semantics of the Accept-Header
-- field. If you request a content-encoding not supported by this module,
-- you will have to decode it yourself (see also the decompress
-- field).
--
-- Note: Multiple header fields with the same field-name will result in
-- multiple header fields being sent and therefore it's the
-- responsibility of the client code to ensure that the rules from RFC
-- 2616 section 4.2 are honoured.
--
-- Since 0.1.0
requestHeaders :: Request -> RequestHeaders
-- | Request body to be sent to the server.
--
-- Since 0.1.0
requestBody :: Request -> RequestBody
-- | Optional HTTP proxy.
--
-- Since 0.1.0
proxy :: Request -> Maybe Proxy
-- | Optional resolved host address. May not be used by all backends.
--
-- Since 0.1.0
hostAddress :: Request -> Maybe HostAddress
-- | If True, a chunked and/or gzipped body will not be decoded.
-- Use with caution.
--
-- Since 0.1.0
rawBody :: Request -> Bool
-- | Predicate to specify whether gzipped data should be decompressed on
-- the fly (see alwaysDecompress and
-- browserDecompress). Argument is the mime type. Default:
-- browserDecompress.
--
-- Since 0.1.0
decompress :: Request -> ByteString -> Bool
-- | How many redirects to follow when getting a resource. 0 means follow
-- no redirects. Default value: 10.
--
-- Since 0.1.0
redirectCount :: Request -> Int
-- | Check the status code. Note that this will run after all redirects are
-- performed. Default: return a StatusCodeException on non-2XX
-- responses.
--
-- Since 0.1.0
checkStatus :: Request -> Status -> ResponseHeaders -> CookieJar -> Maybe SomeException
-- | Number of microseconds to wait for a response. If Nothing,
-- will wait indefinitely. Default: use managerResponseTimeout
-- (which by default is 30 seconds).
--
-- Since 0.1.0
responseTimeout :: Request -> Maybe Int
-- | Wraps the calls for getting new connections. This can be useful for
-- instituting some kind of timeouts. The first argument is the value of
-- responseTimeout. Second argument is the exception to be
-- thrown on failure.
--
-- Default: If responseTimeout is Nothing, does
-- nothing. Otherwise, institutes timeout, and returns remaining time for
-- responseTimeout.
--
-- Since 0.1.0
getConnectionWrapper :: Request -> Maybe Int -> HttpException -> IO (ConnRelease, Connection, ManagedConn) -> IO (Maybe Int, (ConnRelease, Connection, ManagedConn))
-- | A user-defined cookie jar. If Nothing, no cookie handling will
-- take place, "Cookie" headers in requestHeaders will be sent
-- raw, and responseCookieJar will be empty.
--
-- Since 0.1.0
cookieJar :: Request -> Maybe CookieJar
-- | HTTP version to send to server.
--
-- Default: HTTP 1.1
--
-- Since 0.4.3
requestVersion :: Request -> HttpVersion
-- | How to deal with exceptions thrown while sending the request.
--
-- Default: ignore IOExceptions, rethrow all other exceptions.
--
-- Since: 0.4.6
onRequestBodyException :: Request -> SomeException -> IO ()
data ConnReuse
Reuse :: ConnReuse
DontReuse :: ConnReuse
type ConnRelease = ConnReuse -> IO ()
data ManagedConn
Fresh :: ManagedConn
Reused :: ManagedConn
-- | A simple representation of the HTTP response.
--
-- Since 0.1.0
data Response body
Response :: Status -> HttpVersion -> ResponseHeaders -> body -> CookieJar -> ResponseClose -> Response body
-- | Status code of the response.
--
-- Since 0.1.0
responseStatus :: Response body -> Status
-- | HTTP version used by the server.
--
-- Since 0.1.0
responseVersion :: Response body -> HttpVersion
-- | Response headers sent by the server.
--
-- Since 0.1.0
responseHeaders :: Response body -> ResponseHeaders
-- | Response body sent by the server.
--
-- Since 0.1.0
responseBody :: Response body -> body
-- | Cookies set on the client after interacting with the server. If
-- cookies have been disabled by setting cookieJar to
-- Nothing, then this will always be empty.
--
-- Since 0.1.0
responseCookieJar :: Response body -> CookieJar
-- | Releases any resource held by this response. If the response body has
-- not been fully read yet, doing so after this call will likely be
-- impossible.
--
-- Since 0.1.0
responseClose' :: Response body -> ResponseClose
newtype ResponseClose
ResponseClose :: IO () -> ResponseClose
runResponseClose :: ResponseClose -> IO ()
-- | Keeps track of open connections for keep-alive.
--
-- If possible, you should share a single Manager between multiple
-- threads and requests.
--
-- Since 0.1.0
data Manager
Manager :: IORef ConnsMap -> MVar () -> Int -> Maybe Int -> (Maybe HostAddress -> String -> Int -> IO Connection) -> (Maybe HostAddress -> String -> Int -> IO Connection) -> (ByteString -> (Connection -> IO ()) -> String -> Maybe HostAddress -> String -> Int -> IO Connection) -> (SomeException -> Bool) -> (forall a. IO a -> IO a) -> Int -> (Request -> IO Request) -> (Request -> Request) -> Manager
-- | Nothing indicates that the manager is closed.
mConns :: Manager -> IORef ConnsMap
-- | Used to indicate to the reaper thread that it has some work to do.
-- This must be filled every time a connection is returned to the
-- manager. While redundant with the IORef above, this allows us
-- to have the reaper thread fully blocked instead of running every 5
-- seconds when there are no connections to manage.
mConnsBaton :: Manager -> MVar ()
-- | This is a per-ConnKey value.
mMaxConns :: Manager -> Int
-- | Copied from managerResponseTimeout
mResponseTimeout :: Manager -> Maybe Int
mRawConnection :: Manager -> Maybe HostAddress -> String -> Int -> IO Connection
mTlsConnection :: Manager -> Maybe HostAddress -> String -> Int -> IO Connection
mTlsProxyConnection :: Manager -> ByteString -> (Connection -> IO ()) -> String -> Maybe HostAddress -> String -> Int -> IO Connection
mRetryableException :: Manager -> SomeException -> Bool
mWrapIOException :: Manager -> forall a. IO a -> IO a
mIdleConnectionCount :: Manager -> Int
mModifyRequest :: Manager -> Request -> IO Request
-- | See managerProxy
mSetProxy :: Manager -> Request -> Request
data ConnsMap
ManagerClosed :: ConnsMap
ManagerOpen :: {-# UNPACK #-} !Int -> !(Map ConnKey (NonEmptyList Connection)) -> ConnsMap
-- | Settings for a Manager. Please use the
-- defaultManagerSettings function and then modify individual
-- settings. For more information, see
-- http://www.yesodweb.com/book/settings-types.
--
-- Since 0.1.0
data ManagerSettings
ManagerSettings :: Int -> IO (Maybe HostAddress -> String -> Int -> IO Connection) -> IO (Maybe HostAddress -> String -> Int -> IO Connection) -> IO (ByteString -> (Connection -> IO ()) -> String -> Maybe HostAddress -> String -> Int -> IO Connection) -> Maybe Int -> (SomeException -> Bool) -> (forall a. IO a -> IO a) -> Int -> (Request -> IO Request) -> ProxyOverride -> ProxyOverride -> ManagerSettings
-- | Number of connections to a single host to keep alive. Default: 10.
--
-- Since 0.1.0
managerConnCount :: ManagerSettings -> Int
-- | Create an insecure connection.
--
-- Since 0.1.0 FIXME in the future, combine managerTlsConnection and
-- managerTlsProxyConnection
managerRawConnection :: ManagerSettings -> IO (Maybe HostAddress -> String -> Int -> IO Connection)
-- | Create a TLS connection. Default behavior: throw an exception that TLS
-- is not supported.
--
-- Since 0.1.0
managerTlsConnection :: ManagerSettings -> IO (Maybe HostAddress -> String -> Int -> IO Connection)
-- | Create a TLS proxy connection. Default behavior: throw an exception
-- that TLS is not supported.
--
-- Since 0.2.2
managerTlsProxyConnection :: ManagerSettings -> IO (ByteString -> (Connection -> IO ()) -> String -> Maybe HostAddress -> String -> Int -> IO Connection)
-- | Default timeout (in microseconds) to be applied to requests which do
-- not provide a timeout value.
--
-- Default is 30 seconds
--
-- Since 0.1.0
managerResponseTimeout :: ManagerSettings -> Maybe Int
-- | Exceptions for which we should retry our request if we were reusing an
-- already open connection. In the case of IOExceptions, for example, we
-- assume that the connection was closed on the server and therefore open
-- a new one.
--
-- Since 0.1.0
managerRetryableException :: ManagerSettings -> SomeException -> Bool
-- | Action wrapped around all attempted Requests, usually used to
-- wrap up exceptions in library-specific types.
--
-- Default: wrap all IOExceptions in the
-- InternalIOException constructor.
--
-- Since 0.1.0
managerWrapIOException :: ManagerSettings -> forall a. IO a -> IO a
-- | Total number of idle connection to keep open at a given time.
--
-- This limit helps deal with the case where you are making a large
-- number of connections to different hosts. Without this limit, you
-- could run out of file descriptors.
--
-- Default: 512
--
-- Since 0.3.7
managerIdleConnectionCount :: ManagerSettings -> Int
-- | Perform the given modification to a Request before performing
-- it.
--
-- Default: no modification
--
-- Since 0.4.4
managerModifyRequest :: ManagerSettings -> Request -> IO Request
-- | How HTTP proxy server settings should be discovered.
--
-- Default: respect the proxy value on the Request
-- itself.
--
-- Since 0.4.7
managerProxyInsecure :: ManagerSettings -> ProxyOverride
-- | How HTTPS proxy server settings should be discovered.
--
-- Default: respect the proxy value on the Request
-- itself.
--
-- Since 0.4.7
managerProxySecure :: ManagerSettings -> ProxyOverride
data NonEmptyList a
One :: a -> UTCTime -> NonEmptyList a
Cons :: a -> Int -> UTCTime -> (NonEmptyList a) -> NonEmptyList a
-- | Hostname or resolved host address.
data ConnHost
HostName :: Text -> ConnHost
HostAddress :: HostAddress -> ConnHost
-- | ConnKey consists of a hostname, a port and a Bool
-- specifying whether to use SSL.
data ConnKey
ConnKey :: ConnHost -> Int -> Bool -> ConnKey
-- | How the HTTP proxy server settings should be discovered.
--
-- Since 0.4.7
newtype ProxyOverride
ProxyOverride :: (Bool -> IO (Request -> Request)) -> ProxyOverride
runProxyOverride :: ProxyOverride -> Bool -> IO (Request -> Request)
-- | Like hGet, except that a shorter ByteString may be
-- returned if there are not enough bytes immediately available to
-- satisfy the whole request. hGetSome only blocks if there is no
-- data available, and EOF has not yet been reached.
hGetSome :: Handle -> Int -> IO ByteString
(<>) :: Monoid m => m -> m -> m
readDec :: Integral i => String -> Maybe i
hasNoBody :: ByteString -> Int -> Bool
-- | O(1) Convert a strict ByteString into a lazy
-- ByteString.
fromStrict :: ByteString -> ByteString
-- | This is the main entry point for using http-client. Used by itself,
-- this module provides low-level access for streaming request and
-- response bodies, and only non-secure HTTP connections. Helper packages
-- such as http-conduit provided higher level streaming approaches, while
-- other helper packages like http-client-tls provide secure connections.
--
-- There are three core components to be understood here: requests,
-- responses, and managers. A Manager keeps track of open
-- connections to various hosts, and when requested, will provide either
-- an existing open connection or create a new connection on demand. A
-- Manager also automatically reaps connections which have been
-- unused for a certain period of time. A Manager allows for
-- more efficient HTTP usage by allowing for keep-alive connections.
-- Secure HTTP connections can be allowed by modifying the settings used
-- for creating a manager. The simplest way to create a Manager
-- is with:
--
-- -- newManager defaultManagerSettings ---- -- or using the bracket pattern with -- --
-- withManager defaultManagerSettings ---- -- While generally speaking it is a good idea to share a single -- Manager throughout your application, there are cases where it -- makes more sense to create and destroy Managers more -- frequently. As an example, if you have an application which will make -- a large number of requests to different hosts, and will never make -- more than one connection to a single host, then sharing a -- Manager will result in idle connections being kept open -- longer than necessary. In such a situation, it makes sense to use -- withManager around each new request, to avoid running out of -- file descriptors. (Note that the managerIdleConnectionCount -- setting mitigates the risk of leaking too many file descriptors.) -- -- The next core component is a Request, which represents a -- single HTTP request to be sent to a specific server. Requests -- allow for many settings to control exact how they function, but -- usually the simplest approach for creating a Request is to -- use parseUrl. -- -- Finally, a Response is the result of sending a single -- Request to a server, over a connection which was acquired -- from a Manager. Note that you must close the response when -- you're done with it to ensure that the connection is recycled to the -- Manager to either be used by another request, or to be -- reaped. Usage of withResponse will ensure that this happens -- automatically. -- -- Helper packages may provide replacements for various recommendations -- listed above. For example, if using http-client-tls, instead of using -- defaultManagerSettings, you would want to use -- tlsManagerSettings. Be sure to read the relevant helper -- library documentation for more information. -- -- A note on exceptions: for the most part, all actions that perform I/O -- should be assumed to throw an HttpException in the event of -- some problem, and all pure functions will be total. For example, -- withResponse, httpLbs, and BodyReader can -- all throw exceptions. Functions like responseStatus and -- applyBasicAuth are guaranteed to be total (or there's a bug -- in the library). -- -- One thing to be cautioned about: the type of parseUrl allows -- it to work in different monads. If used in the IO monad, it -- will throw an exception in the case of an invalid URI. In addition, if -- you leverage the IsString instance of the Request -- value via OverloadedStrings, an invalid URI will result in a -- partial value. Caveat emptor! -- -- Non-2xx responses: the default behavior of all functions in -- http-client is to automatically perform up to 10 redirects (response -- codes 301, 302, 303, and 307), and to throw a -- StatusCodeException on all responses whose status are not in -- the 2xx range. These behaviors can be overridden by the -- redirectCount and checkStatus settings on a request, -- respectively. module Network.HTTP.Client -- | Perform a Request using a connection acquired from the given -- Manager, and then provide the Response to the given -- function. This function is fully exception safe, guaranteeing that the -- response will be closed when the inner function exits. It is defined -- as: -- --
-- withResponse req man f = bracket (responseOpen req man) responseClose f ---- -- It is recommended that you use this function in place of explicit -- calls to responseOpen and responseClose. -- -- You will need to use functions such as brRead to consume the -- response body. -- -- Since 0.1.0 withResponse :: Request -> Manager -> (Response BodyReader -> IO a) -> IO a -- | A convenience wrapper around withResponse which reads in the -- entire response body and immediately closes the connection. Note that -- this function performs fully strict I/O, and only uses a lazy -- ByteString in its response for memory efficiency. If you are -- anticipating a large response body, you are encouraged to use -- withResponse and brRead instead. -- -- Since 0.1.0 httpLbs :: Request -> Manager -> IO (Response ByteString) -- | A convenient wrapper around withResponse which ignores the -- response body. This is useful, for example, when performing a HEAD -- request. -- -- Since 0.3.2 httpNoBody :: Request -> Manager -> IO (Response ()) -- | The most low-level function for initiating an HTTP request. -- -- The first argument to this function gives a full specification on the -- request: the host to connect to, whether to use SSL, headers, etc. -- Please see Request for full details. The second argument -- specifies which Manager should be used. -- -- This function then returns a Response with a BodyReader. -- The Response contains the status code and headers that were -- sent back to us, and the BodyReader contains the body of the -- request. Note that this BodyReader allows you to have fully -- interleaved IO actions during your HTTP download, making it possible -- to download very large responses in constant memory. -- -- An important note: the response body returned by this function -- represents a live HTTP connection. As such, if you do not use the -- response body, an open socket will be retained indefinitely. You must -- be certain to call responseClose on this response to free up -- resources. -- -- This function automatically performs any necessary redirects, as -- specified by the redirectCount setting. -- -- When implementing a (reverse) proxy using this function or relating -- functions, it's wise to remove Transfer-Encoding:, Content-Length:, -- Content-Encoding: and Accept-Encoding: from request and response -- headers to be relayed. -- -- Since 0.1.0 responseOpen :: Request -> Manager -> IO (Response BodyReader) -- | Close any open resources associated with the given Response. -- In general, this will either close an active Connection or -- return it to the Manager to be reused. -- -- Since 0.1.0 responseClose :: Response a -> IO () -- | A variant of withResponse which keeps a history of all -- redirects performed in the interim, together with the first 1024 bytes -- of their response bodies. -- -- Since 0.4.1 withResponseHistory :: Request -> Manager -> (HistoriedResponse BodyReader -> IO a) -> IO a -- | A variant of responseOpen which keeps a history of all -- redirects performed in the interim, together with the first 1024 bytes -- of their response bodies. -- -- Since 0.4.1 responseOpenHistory :: Request -> Manager -> IO (HistoriedResponse BodyReader) -- | A datatype holding information on redirected requests and the final -- response. -- -- Since 0.4.1 data HistoriedResponse body -- | Requests which resulted in a redirect, together with their responses. -- The response contains the first 1024 bytes of the body. -- -- Since 0.4.1 hrRedirects :: HistoriedResponse body -> [(Request, Response ByteString)] -- | The final request performed. -- -- Since 0.4.1 hrFinalRequest :: HistoriedResponse body -> Request -- | The response from the final request. -- -- Since 0.4.1 hrFinalResponse :: HistoriedResponse body -> Response body -- | Keeps track of open connections for keep-alive. -- -- If possible, you should share a single Manager between multiple -- threads and requests. -- -- Since 0.1.0 data Manager -- | Create a Manager. You may manually call closeManager to -- shut it down, or allow the Manager to be shut down -- automatically based on garbage collection. -- -- Creating a new Manager is a relatively expensive operation, you -- are advised to share a single Manager between requests instead. -- -- The first argument to this function is often -- defaultManagerSettings, though add-on libraries may provide a -- recommended replacement. -- -- Since 0.1.0 newManager :: ManagerSettings -> IO Manager -- | Close all connections in a Manager. -- -- Note that this doesn't affect currently in-flight connections, meaning -- you can safely use it without hurting any queries you may have -- concurrently running. -- -- Since 0.1.0 closeManager :: Manager -> IO () -- | Create, use and close a Manager. -- -- Since 0.2.1 withManager :: ManagerSettings -> (Manager -> IO a) -> IO a -- | Settings for a Manager. Please use the -- defaultManagerSettings function and then modify individual -- settings. For more information, see -- http://www.yesodweb.com/book/settings-types. -- -- Since 0.1.0 data ManagerSettings -- | Default value for ManagerSettings. -- -- Note that this value does not have support for SSL/TLS. If you -- need to make any https connections, please use the http-client-tls -- package, which provides a tlsManagerSettings value. -- -- Since 0.1.0 defaultManagerSettings :: ManagerSettings -- | Number of connections to a single host to keep alive. Default: 10. -- -- Since 0.1.0 managerConnCount :: ManagerSettings -> Int -- | Create an insecure connection. -- -- Since 0.1.0 FIXME in the future, combine managerTlsConnection and -- managerTlsProxyConnection managerRawConnection :: ManagerSettings -> IO (Maybe HostAddress -> String -> Int -> IO Connection) -- | Create a TLS connection. Default behavior: throw an exception that TLS -- is not supported. -- -- Since 0.1.0 managerTlsConnection :: ManagerSettings -> IO (Maybe HostAddress -> String -> Int -> IO Connection) -- | Default timeout (in microseconds) to be applied to requests which do -- not provide a timeout value. -- -- Default is 30 seconds -- -- Since 0.1.0 managerResponseTimeout :: ManagerSettings -> Maybe Int -- | Exceptions for which we should retry our request if we were reusing an -- already open connection. In the case of IOExceptions, for example, we -- assume that the connection was closed on the server and therefore open -- a new one. -- -- Since 0.1.0 managerRetryableException :: ManagerSettings -> SomeException -> Bool -- | Action wrapped around all attempted Requests, usually used to -- wrap up exceptions in library-specific types. -- -- Default: wrap all IOExceptions in the -- InternalIOException constructor. -- -- Since 0.1.0 managerWrapIOException :: ManagerSettings -> forall a. IO a -> IO a -- | Total number of idle connection to keep open at a given time. -- -- This limit helps deal with the case where you are making a large -- number of connections to different hosts. Without this limit, you -- could run out of file descriptors. -- -- Default: 512 -- -- Since 0.3.7 managerIdleConnectionCount :: ManagerSettings -> Int -- | Perform the given modification to a Request before performing -- it. -- -- Default: no modification -- -- Since 0.4.4 managerModifyRequest :: ManagerSettings -> Request -> IO Request -- | Set the proxy override value, for both HTTP (insecure) and HTTPS -- (insecure) connections. -- -- Since 0.4.7 managerSetProxy :: ProxyOverride -> ManagerSettings -> ManagerSettings -- | Set the proxy override value, only for HTTP (insecure) connections. -- -- Since 0.4.7 managerSetInsecureProxy :: ProxyOverride -> ManagerSettings -> ManagerSettings -- | Set the proxy override value, only for HTTPS (secure) connections. -- -- Since 0.4.7 managerSetSecureProxy :: ProxyOverride -> ManagerSettings -> ManagerSettings -- | How the HTTP proxy server settings should be discovered. -- -- Since 0.4.7 data ProxyOverride -- | Get the proxy settings from the Request itself. -- -- Since 0.4.7 proxyFromRequest :: ProxyOverride -- | Never connect using a proxy, regardless of the proxy value in the -- Request. -- -- Since 0.4.7 noProxy :: ProxyOverride -- | Use the given proxy settings, regardless of the proxy value in the -- Request. -- -- Since 0.4.7 useProxy :: Proxy -> ProxyOverride -- | Get the proxy settings from the default environment variable -- (http_proxy for insecure, https_proxy for secure). -- If no variable is set, then fall back to the given value. -- Nothing is equivalent to noProxy, Just is -- equivalent to useProxy. -- -- Since 0.4.7 proxyEnvironment :: Maybe Proxy -> ProxyOverride -- | Same as proxyEnvironment, but instead of default environment -- variable names, allows you to set your own name. -- -- Since 0.4.7 proxyEnvironmentNamed :: Text -> Maybe Proxy -> ProxyOverride -- | The default proxy settings for a manager. In particular: if the -- http_proxy (or https_proxy) environment variable is -- set, use it. Otherwise, use the values in the Request. -- -- Since 0.4.7 defaultProxy :: ProxyOverride -- | A value for the managerRawConnection setting, but also allows -- you to modify the underlying Socket to set additional -- settings. For a motivating use case, see: -- https://github.com/snoyberg/http-client/issues/71. -- -- Since 0.3.8 rawConnectionModifySocket :: (Socket -> IO ()) -> IO (Maybe HostAddress -> String -> Int -> IO Connection) -- | Convert a URL into a Request. -- -- This defaults some of the values in Request, such as setting -- method to GET and requestHeaders to []. -- -- Since this function uses MonadThrow, the return monad can be -- anything that is an instance of MonadThrow, such as IO -- or Maybe. -- -- Since 0.1.0 parseUrl :: MonadThrow m => String -> m Request -- | Add a Basic Auth header (with the specified user name and password) to -- the given Request. Ignore error handling: -- --
-- applyBasicAuth "user" "pass" $ fromJust $ parseUrl url ---- -- Since 0.1.0 applyBasicAuth :: ByteString -> ByteString -> Request -> Request -- | Add url-encoded parameters to the Request. -- -- This sets a new requestBody, adds a content-type request header -- and changes the method to POST. -- -- Since 0.1.0 urlEncodedBody :: [(ByteString, ByteString)] -> Request -> Request -- | Extract a URI from the request. -- -- Since 0.1.0 getUri :: Request -> URI -- | Set the query string to the given key/value pairs. -- -- Since 0.3.6 setQueryString :: [(ByteString, Maybe ByteString)] -> Request -> Request -- | All information on how to connect to a host and what should be sent in -- the HTTP request. -- -- If you simply wish to download from a URL, see parseUrl. -- -- The constructor for this data type is not exposed. Instead, you should -- use either the def method to retrieve a default instance, or -- parseUrl to construct from a URL, and then use the records -- below to make modifications. This approach allows http-client to add -- configuration options without breaking backwards compatibility. -- -- For example, to construct a POST request, you could do something like: -- --
-- initReq <- parseUrl "http://www.example.com/path"
-- let req = initReq
-- { method = "POST"
-- }
--
--
-- For more information, please see
-- http://www.yesodweb.com/book/settings-types.
--
-- Since 0.1.0
data Request
-- | HTTP request method, eg GET, POST.
--
-- Since 0.1.0
method :: Request -> Method
-- | Whether to use HTTPS (ie, SSL).
--
-- Since 0.1.0
secure :: Request -> Bool
-- | Requested host name, used for both the IP address to connect to and
-- the host request header.
--
-- Since 0.1.0
host :: Request -> ByteString
-- | The port to connect to. Also used for generating the host
-- request header.
--
-- Since 0.1.0
port :: Request -> Int
-- | Everything from the host to the query string.
--
-- Since 0.1.0
path :: Request -> ByteString
-- | Query string appended to the path.
--
-- Since 0.1.0
queryString :: Request -> ByteString
-- | Custom HTTP request headers
--
-- The Content-Length and Transfer-Encoding headers are set automatically
-- by this module, and shall not be added to requestHeaders.
--
-- If not provided by the user, Host will automatically be set
-- based on the host and port fields.
--
-- Moreover, the Accept-Encoding header is set implicitly to gzip for
-- convenience by default. This behaviour can be overridden if needed, by
-- setting the header explicitly to a different value. In order to omit
-- the Accept-Header altogether, set it to the empty string "". If you
-- need an empty Accept-Header (i.e. requesting the identity encoding),
-- set it to a non-empty white-space string, e.g. " ". See RFC 2616
-- section 14.3 for details about the semantics of the Accept-Header
-- field. If you request a content-encoding not supported by this module,
-- you will have to decode it yourself (see also the decompress
-- field).
--
-- Note: Multiple header fields with the same field-name will result in
-- multiple header fields being sent and therefore it's the
-- responsibility of the client code to ensure that the rules from RFC
-- 2616 section 4.2 are honoured.
--
-- Since 0.1.0
requestHeaders :: Request -> RequestHeaders
-- | Request body to be sent to the server.
--
-- Since 0.1.0
requestBody :: Request -> RequestBody
-- | Optional HTTP proxy.
--
-- Since 0.1.0
proxy :: Request -> Maybe Proxy
-- | Add a Proxy-Authorization header (with the specified username and
-- password) to the given Request. Ignore error handling:
--
-- -- applyBasicProxyAuth "user" "pass" <$> parseUrl "http://example.org" ---- -- Since 0.3.4 applyBasicProxyAuth :: ByteString -> ByteString -> Request -> Request -- | Predicate to specify whether gzipped data should be decompressed on -- the fly (see alwaysDecompress and -- browserDecompress). Argument is the mime type. Default: -- browserDecompress. -- -- Since 0.1.0 decompress :: Request -> ByteString -> Bool -- | How many redirects to follow when getting a resource. 0 means follow -- no redirects. Default value: 10. -- -- Since 0.1.0 redirectCount :: Request -> Int -- | Check the status code. Note that this will run after all redirects are -- performed. Default: return a StatusCodeException on non-2XX -- responses. -- -- Since 0.1.0 checkStatus :: Request -> Status -> ResponseHeaders -> CookieJar -> Maybe SomeException -- | Number of microseconds to wait for a response. If Nothing, -- will wait indefinitely. Default: use managerResponseTimeout -- (which by default is 30 seconds). -- -- Since 0.1.0 responseTimeout :: Request -> Maybe Int -- | A user-defined cookie jar. If Nothing, no cookie handling will -- take place, "Cookie" headers in requestHeaders will be sent -- raw, and responseCookieJar will be empty. -- -- Since 0.1.0 cookieJar :: Request -> Maybe CookieJar -- | HTTP version to send to server. -- -- Default: HTTP 1.1 -- -- Since 0.4.3 requestVersion :: Request -> HttpVersion -- | When using one of the RequestBodyStream / -- RequestBodyStreamChunked constructors, you must ensure that the -- GivesPopper can be called multiple times. Usually this is not a -- problem. -- -- The RequestBodyStreamChunked will send a chunked request body. -- Note that not all servers support this. Only use -- RequestBodyStreamChunked if you know the server you're sending -- to supports chunked request bodies. -- -- Since 0.1.0 data RequestBody RequestBodyLBS :: ByteString -> RequestBody RequestBodyBS :: ByteString -> RequestBody RequestBodyBuilder :: Int64 -> Builder -> RequestBody RequestBodyStream :: Int64 -> (GivesPopper ()) -> RequestBody RequestBodyStreamChunked :: (GivesPopper ()) -> RequestBody -- | A function which generates successive chunks of a request body, -- provider a single empty bytestring when no more data is available. -- -- Since 0.1.0 type Popper = IO ByteString -- | A function which must be provided with a Popper. -- -- Since 0.1.0 type NeedsPopper a = Popper -> IO a -- | A function which will provide a Popper to a NeedsPopper. -- This seemingly convoluted structure allows for creation of request -- bodies which allocate scarce resources in an exception safe manner. -- -- Since 0.1.0 type GivesPopper a = NeedsPopper a -> IO a -- | A simple representation of the HTTP response. -- -- Since 0.1.0 data Response body -- | Status code of the response. -- -- Since 0.1.0 responseStatus :: Response body -> Status -- | HTTP version used by the server. -- -- Since 0.1.0 responseVersion :: Response body -> HttpVersion -- | Response headers sent by the server. -- -- Since 0.1.0 responseHeaders :: Response body -> ResponseHeaders -- | Response body sent by the server. -- -- Since 0.1.0 responseBody :: Response body -> body -- | Cookies set on the client after interacting with the server. If -- cookies have been disabled by setting cookieJar to -- Nothing, then this will always be empty. -- -- Since 0.1.0 responseCookieJar :: Response body -> CookieJar -- | An IO action that represents an incoming response body coming -- from the server. Data provided by this action has already been -- gunzipped and de-chunked, and respects any content-length headers -- present. -- -- The action gets a single chunk of data from the response body, or an -- empty bytestring if no more data is available. -- -- Since 0.4.0 type BodyReader = IO ByteString -- | Get a single chunk of data from the response body, or an empty -- bytestring if no more data is available. -- -- Since 0.1.0 brRead :: BodyReader -> IO ByteString -- | Strictly consume all remaining chunks of data from the stream. -- -- Since 0.1.0 brConsume :: BodyReader -> IO [ByteString] data HttpException StatusCodeException :: Status -> ResponseHeaders -> CookieJar -> HttpException InvalidUrlException :: String -> String -> HttpException -- | List of encountered responses containing redirects in reverse -- chronological order; including last redirect, which triggered the -- exception and was not followed. TooManyRedirects :: [Response ByteString] -> HttpException -- | Response containing unparseable redirect. UnparseableRedirect :: (Response ByteString) -> HttpException TooManyRetries :: HttpException HttpParserException :: String -> HttpException HandshakeFailed :: HttpException OverlongHeaders :: HttpException ResponseTimeout :: HttpException -- | host/port FailedConnectionException :: String -> Int -> HttpException -- | hostportsecure FailedConnectionException2 :: String -> Int -> Bool -> SomeException -> HttpException ExpectedBlankAfter100Continue :: HttpException InvalidStatusLine :: ByteString -> HttpException InvalidHeader :: ByteString -> HttpException InternalIOException :: IOException -> HttpException -- | host/port ProxyConnectException :: ByteString -> Int -> (Either ByteString HttpException) -> HttpException NoResponseDataReceived :: HttpException TlsException :: SomeException -> HttpException TlsNotSupported :: HttpException -- | Expected size/actual size. -- -- Since 1.9.4 ResponseBodyTooShort :: Word64 -> Word64 -> HttpException -- | Since 1.9.4 InvalidChunkHeaders :: HttpException IncompleteHeaders :: HttpException InvalidDestinationHost :: ByteString -> HttpException -- | Since 0.3 HttpZlibException :: ZlibException -> HttpException -- | Environment name and value -- -- Since 0.4.7 InvalidProxyEnvironmentVariable :: Text -> Text -> HttpException data Cookie Cookie :: ByteString -> ByteString -> UTCTime -> ByteString -> ByteString -> UTCTime -> UTCTime -> Bool -> Bool -> Bool -> Bool -> Cookie cookie_name :: Cookie -> ByteString cookie_value :: Cookie -> ByteString cookie_expiry_time :: Cookie -> UTCTime cookie_domain :: Cookie -> ByteString cookie_path :: Cookie -> ByteString cookie_creation_time :: Cookie -> UTCTime cookie_last_access_time :: Cookie -> UTCTime cookie_persistent :: Cookie -> Bool cookie_host_only :: Cookie -> Bool cookie_secure_only :: Cookie -> Bool cookie_http_only :: Cookie -> Bool data CookieJar -- | Define a HTTP proxy, consisting of a hostname and port number. data Proxy Proxy :: ByteString -> Int -> Proxy -- | The host name of the HTTP proxy. proxyHost :: Proxy -> ByteString -- | The port number of the HTTP proxy. proxyPort :: Proxy -> Int -- | This applies receiveSetCookie to a given Response updateCookieJar :: Response a -> Request -> UTCTime -> CookieJar -> (CookieJar, Response a) -- | This corresponds to the algorithm described in Section 5.3 "Storage -- Model" This function consists of calling generateCookie -- followed by insertCheckedCookie. Use this function if you plan -- to do both in a row. generateCookie and -- insertCheckedCookie are only provided for more fine-grained -- control. receiveSetCookie :: SetCookie -> Request -> UTCTime -> Bool -> CookieJar -> CookieJar -- | Turn a SetCookie into a Cookie, if it is valid generateCookie :: SetCookie -> Request -> UTCTime -> Bool -> Maybe Cookie -- | Insert a cookie created by generateCookie into the cookie jar (or not -- if it shouldn't be allowed in) insertCheckedCookie :: Cookie -> CookieJar -> Bool -> CookieJar -- | This applies the computeCookieString to a given Request insertCookiesIntoRequest :: Request -> CookieJar -> UTCTime -> (Request, CookieJar) -- | This corresponds to the algorithm described in Section 5.4 "The Cookie -- Header" computeCookieString :: Request -> CookieJar -> UTCTime -> Bool -> (ByteString, CookieJar) -- | This corresponds to the eviction algorithm described in Section 5.3 -- "Storage Model" evictExpiredCookies :: CookieJar -> UTCTime -> CookieJar createCookieJar :: [Cookie] -> CookieJar destroyCookieJar :: CookieJar -> [Cookie] -- | This corresponds to the subcomponent algorithm entitled "Path-Match" -- detailed in section 5.1.4 pathMatches :: ByteString -> ByteString -> Bool removeExistingCookieFromCookieJar :: Cookie -> CookieJar -> (Maybe Cookie, CookieJar) -- | This corresponds to the subcomponent algorithm entitled "Domain -- Matching" detailed in section 5.1.3 domainMatches :: ByteString -> ByteString -> Bool isIpAddress :: ByteString -> Bool -- | This corresponds to the subcomponent algorithm entitled "Paths" -- detailed in section 5.1.4 defaultPath :: Request -> ByteString instance Typeable HistoriedResponse instance Functor HistoriedResponse instance Traversable HistoriedResponse instance Foldable HistoriedResponse instance Show body => Show (HistoriedResponse body) instance Generic (HistoriedResponse body) instance Datatype D1HistoriedResponse instance Constructor C1_0HistoriedResponse instance Selector S1_0_0HistoriedResponse instance Selector S1_0_1HistoriedResponse instance Selector S1_0_2HistoriedResponse -- | This module handles building multipart/form-data. Example usage: -- --
-- {-# LANGUAGE OverloadedStrings #-}
-- import Network
-- import Network.HTTP.Client
-- import Network.HTTP.Client.MultipartFormData
--
-- import Data.Text.Encoding as TE
--
-- import Control.Monad
--
-- main = withSocketsDo $ void $ withManager defaultManagerSettings $ \m -> do
-- req1 <- parseUrl "http://random-cat-photo.net/cat.jpg"
-- res <- httpLbs req1 m
-- req2 <- parseUrl "http://example.org/~friedrich/blog/addPost.hs"
-- flip httpLbs m =<<
-- (formDataBody [partBS "title" "Bleaurgh"
-- ,partBS "text" $ TE.encodeUtf8 "矢田矢田矢田矢田矢田"
-- ,partFileSource "file1" "/home/friedrich/Photos/MyLittlePony.jpg"
-- ,partFileRequestBody "file2" "cat.jpg" $ RequestBodyLBS $ responseBody res]
-- req2)
--
module Network.HTTP.Client.MultipartFormData
-- | A single part of a multipart message.
data Part
-- | Name of the corresponding <input>
partName :: Part -> Text
-- | A file name, if this is an attached file
partFilename :: Part -> Maybe String
-- | Content type
partContentType :: Part -> Maybe MimeType
-- | List of additional headers
partHeaders :: Part -> [Header]
-- | Action in m which returns the body of a message.
partGetBody :: Part -> IO RequestBody
-- | Make a Part whose content is a strict ByteString.
--
-- The Part does not have a file name or content type associated
-- with it.
partBS :: Text -> ByteString -> Part
-- | Make a Part whose content is a lazy ByteString.
--
-- The Part does not have a file name or content type associated
-- with it.
partLBS :: Text -> ByteString -> Part
-- | Make a Part from a file.
--
-- The entire file will reside in memory at once. If you want constant
-- memory usage, use partFileSource.
--
-- The FilePath supplied will be used as the file name of the
-- Part. If you do not want to reveal this name to the server, you
-- must remove it prior to uploading.
--
-- The Part does not have a content type associated with it.
partFile :: Text -> FilePath -> Part
-- | Stream a Part from a file.
--
-- The FilePath supplied will be used as the file name of the
-- Part. If you do not want to reveal this name to the server, you
-- must remove it prior to uploading.
--
-- The Part does not have a content type associated with it.
partFileSource :: Text -> FilePath -> Part
-- | partFileSourceChunked will read a file and send it in chunks.
--
-- Note that not all servers support this. Only use
-- partFileSourceChunked if you know the server you're sending to
-- supports chunked request bodies.
--
-- The FilePath supplied will be used as the file name of the
-- Part. If you do not want to reveal this name to the server, you
-- must remove it prior to uploading.
--
-- The Part does not have a content type associated with it.
partFileSourceChunked :: Text -> FilePath -> Part
-- | Construct a Part from form name, filepath and a
-- RequestBody
--
--
-- partFileRequestBody "who_calls" "caller.json" $ RequestBodyBS "{\"caller\":\"Jason J Jason\"}"
--
--
-- -- -- empty upload form -- partFileRequestBody "file" mempty mempty ---- -- The Part does not have a content type associated with it. partFileRequestBody :: Text -> FilePath -> RequestBody -> Part -- | Construct a Part from action returning the RequestBody -- --
-- partFileRequestBodyM "cat_photo" "haskell-the-cat.jpg" $ do -- size <- fromInteger <$> withBinaryFile "haskell-the-cat.jpg" ReadMode hFileSize -- return $ RequestBodySource size $ CB.sourceFile "haskell-the-cat.jpg" $= CL.map fromByteString ---- -- The Part does not have a content type associated with it. partFileRequestBodyM :: Text -> FilePath -> IO RequestBody -> Part -- | Add a list of additional headers to this Part. addPartHeaders :: Part -> [Header] -> Part -- | Add form data to the Request. -- -- This sets a new requestBody, adds a content-type request header -- and changes the method to POST. formDataBody :: MonadIO m => [Part] -> Request -> m Request -- | Add form data with supplied boundary formDataBodyWithBoundary :: ByteString -> [Part] -> Request -> IO Request -- | Generate a boundary simillar to those generated by WebKit-based -- browsers. webkitBoundary :: IO ByteString webkitBoundaryPure :: RandomGen g => g -> (ByteString, g) -- | Combine the Parts to form multipart/form-data body renderParts :: ByteString -> [Part] -> IO RequestBody renderPart :: ByteString -> Part -> IO RequestBody instance Show Part