snap-core-1.0.5.1: Snap: A Haskell Web Framework (core interfaces and types)

Safe Haskell | None
Language | Haskell2010

Snap.Util.Proxy

Description

This module provides facilities for patching incoming `Requests` to correct the value of `rqClientAddr` if the snap server is running behind a proxy.

Example usage:

    m :: Snap ()
    m = undefined  -- code goes here

    applicationHandler :: Snap ()
    applicationHandler = behindProxy X_Forwarded_For m

Synopsis

- data ProxyType
  - = NoProxy
  - | X_Forwarded_For
- behindProxy :: MonadSnap m => ProxyType -> m a -> m a

# Documentation

data ProxyType #

What kind of proxy is this? Affects which headers `behindProxy` pulls the original remote address from.

Currently only proxy servers that send `X-Forwarded-For` or `Forwarded-For` are supported.

Constructors

NoProxy | no proxy, leave the request alone
X_Forwarded_For | Use the `Forwarded-For` or `X-Forwarded-For` header

#### Instances

Instances details

Read ProxyType # |
Instance details Defined in Snap.Util.Proxy Methods readsPrec :: Int -> ReadS ProxyType # readList :: ReadS [ProxyType] # readPrec :: ReadPrec ProxyType # readListPrec :: ReadPrec [ProxyType] #
Show ProxyType # |
Instance details Defined in Snap.Util.Proxy Methods showsPrec :: Int -> ProxyType -> ShowS # show :: ProxyType -> String # showList :: [ProxyType] -> ShowS #
Eq ProxyType # |
Instance details Defined in Snap.Util.Proxy Methods (==) :: ProxyType -> ProxyType -> Bool # (/=) :: ProxyType -> ProxyType -> Bool #
Ord ProxyType # |
Instance details Defined in Snap.Util.Proxy Methods compare :: ProxyType -> ProxyType -> Ordering # (<) :: ProxyType -> ProxyType -> Bool # (<=) :: ProxyType -> ProxyType -> Bool # (>) :: ProxyType -> ProxyType -> Bool # (>=) :: ProxyType -> ProxyType -> Bool # max :: ProxyType -> ProxyType -> ProxyType # min :: ProxyType -> ProxyType -> ProxyType #

behindProxy :: MonadSnap m => ProxyType -> m a -> m a #

Rewrite `rqClientAddr` if we're behind a proxy.

Example:

    ghci> :set -XOverloadedStrings
    ghci> import qualified Data.Map as M
    ghci> import qualified Snap.Test as T
    ghci> let r = T.get "/foo" M.empty >> T.addHeader "X-Forwarded-For" "1.2.3.4"
    ghci> let h = getsRequest rqClientAddr >>= writeBS)
    ghci> T.runHandler r h
    HTTP/1.1 200 OK
    server: Snap/test
    date: Fri, 08 Aug 2014 14:32:29 GMT

    127.0.0.1
    ghci> T.runHandler r (behindProxy X_Forwarded_For h)
    HTTP/1.1 200 OK
    server: Snap/test
    date: Fri, 08 Aug 2014 14:33:02 GMT

    1.2.3.4