-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Reverse proxy HTTP requests, either over raw sockets or with WAI
--   
--   Provides a simple means of reverse-proxying HTTP requests. The raw
--   approach uses the same technique as leveraged by keter, whereas the
--   WAI approach performs full request/response parsing via WAI and
--   http-conduit.
@package http-reverse-proxy
@version 0.4.3

module Network.HTTP.ReverseProxy

-- | Host/port combination to which we want to proxy.
data ProxyDest
ProxyDest :: !ByteString -> !Int -> ProxyDest
[pdHost] :: ProxyDest -> !ByteString
[pdPort] :: ProxyDest -> !Int

-- | Set up a reverse proxy server, which will have a minimal overhead.
--   
--   This function uses raw sockets, parsing as little of the request as
--   possible. The workflow is:
--   
--   <ol>
--   <li>Parse the first request headers.</li>
--   <li>Ask the supplied function to specify how to reverse proxy.</li>
--   <li>Open up a connection to the given host/port.</li>
--   <li>Pass all bytes across the wire unchanged.</li>
--   </ol>
--   
--   If you need more control, such as modifying the request or response,
--   use <a>waiProxyTo</a>.
rawProxyTo :: (MonadBaseControl IO m, MonadIO m) => (RequestHeaders -> m (Either (AppData -> m ()) ProxyDest)) -> AppData -> m ()

-- | Creates a WAI <a>Application</a> which will handle reverse proxies.
--   
--   Connections to the proxied server will be provided via http-conduit.
--   As such, all requests and responses will be fully processed in your
--   reverse proxy. This allows you much more control over the data sent
--   over the wire, but also incurs overhead. For a lower-overhead
--   approach, consider <a>rawProxyTo</a>.
--   
--   Most likely, the given application should be run with Warp, though in
--   theory other WAI handlers will work as well.
--   
--   Note: This function will use chunked request bodies for communicating
--   with the proxied server. Not all servers necessarily support chunked
--   request bodies, so please confirm that yours does (Warp, Snap, and
--   Happstack, for example, do).
waiProxyTo :: (Request -> IO WaiProxyResponse) -> (SomeException -> Application) -> Manager -> Application

-- | Sends a simple 502 bad gateway error message with the contents of the
--   exception.
defaultOnExc :: SomeException -> Application
waiProxyToSettings :: (Request -> IO WaiProxyResponse) -> WaiProxySettings -> Manager -> Application

-- | The different responses that could be generated by a
--   <tt>waiProxyTo</tt> lookup function.
--   
--   Since 0.2.0
data WaiProxyResponse

-- | Respond with the given WAI Response.
--   
--   Since 0.2.0
WPRResponse :: Response -> WaiProxyResponse

-- | Send to the given destination.
--   
--   Since 0.2.0
WPRProxyDest :: ProxyDest -> WaiProxyResponse

-- | Send to the given destination via HTTPS.
WPRProxyDestSecure :: ProxyDest -> WaiProxyResponse

-- | Send to the given destination, but use the given modified Request for
--   computing the reverse-proxied request. This can be useful for reverse
--   proxying to a different path than the one specified. By the user.
--   
--   Since 0.2.0
WPRModifiedRequest :: Request -> ProxyDest -> WaiProxyResponse

-- | Same as WPRModifiedRequest but send to the given destination via
--   HTTPS.
WPRModifiedRequestSecure :: Request -> ProxyDest -> WaiProxyResponse

-- | Respond with the given WAI Application.
--   
--   Since 0.4.0
WPRApplication :: Application -> WaiProxyResponse
data WaiProxySettings

-- | The default value for this type.
def :: Default a => a
wpsOnExc :: WaiProxySettings -> SomeException -> Application
wpsTimeout :: WaiProxySettings -> Maybe Int

-- | Set the X-Real-IP request header with the client's IP address.
--   
--   Default: SIHFromSocket
--   
--   Since 0.2.0
wpsSetIpHeader :: WaiProxySettings -> SetIpHeader

-- | Post-process the response body returned from the host.
--   
--   Since 0.2.1
wpsProcessBody :: WaiProxySettings -> Response () -> Maybe (Conduit ByteString IO (Flush Builder))

-- | Determine if the request should be upgraded to a raw proxy connection,
--   as is needed for WebSockets. Requires WAI 2.1 or higher and a WAI
--   handler with raw response support (e.g., Warp) to work.
--   
--   Default: check if the upgrade header is websocket.
--   
--   Since 0.3.1
wpsUpgradeToRaw :: WaiProxySettings -> Request -> Bool

-- | Allow to override proxy settings for each request. If you supply this
--   field it will take precedence over getDest parameter in
--   waiProxyToSettings
--   
--   Default: have one global setting
--   
--   Since 0.4.2
wpsGetDest :: WaiProxySettings -> Maybe (Request -> IO (LocalWaiProxySettings, WaiProxyResponse))

-- | How to set the X-Real-IP request header.
--   
--   Since 0.2.0
data SetIpHeader

-- | Do not set the header
SIHNone :: SetIpHeader

-- | Set it from the socket's address.
SIHFromSocket :: SetIpHeader

-- | Set it from either X-Real-IP or X-Forwarded-For, if present
SIHFromHeader :: SetIpHeader
data LocalWaiProxySettings

-- | Default value for <a>LocalWaiProxySettings</a>, same as <a>def</a> but
--   with a more explicit name.
--   
--   Since 0.4.2
defaultLocalWaiProxySettings :: LocalWaiProxySettings

-- | Allows to specify the maximum time allowed for the conection on per
--   request basis.
--   
--   Default: no timeouts
--   
--   Since 0.4.2
setLpsTimeBound :: Maybe Int -> LocalWaiProxySettings -> LocalWaiProxySettings
instance Data.Default.Class.Default Network.HTTP.ReverseProxy.LocalWaiProxySettings
instance Data.Default.Class.Default Network.HTTP.ReverseProxy.WaiProxySettings
