    {-# LANGUAGE CPP #-}

    -- | Only allow local connections.
    module Network.Wai.Middleware.Local (
        local,
    ) where

    import Network.Socket (SockAddr (..))
    import Network.Wai (Middleware, Response, remoteHost)

    -- | This middleware rejects non-local connections with a specific response.
    --   It is useful when supporting web-based local applications, which would
    --   typically want to reject external connections.
    local :: Response -> Middleware
    local :: Response -> Middleware
    local Response
    resp Application
    f Request
    r Response -> IO ResponseReceived
    k = case Request -> SockAddr
    remoteHost Request
    r of
        SockAddrInet PortNumber
    _ HostAddress
    h
            | HostAddress
    h HostAddress -> HostAddress -> Bool
    forall a. Eq a => a -> a -> Bool
    == Integer -> HostAddress
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral Integer
    home ->
                Application
    f Request
    r Response -> IO ResponseReceived
    k
    #if !defined(mingw32_HOST_OS) && !defined(_WIN32)
        SockAddrUnix String
    _ -> Application
    f Request
    r Response -> IO ResponseReceived
    k
    #endif
        SockAddr
    _ -> Response -> IO ResponseReceived
    k Response
    resp
      where
        home :: Integer
        home :: Integer
    home = Integer
    127 Integer -> Integer -> Integer
    forall a. Num a => a -> a -> a
    + (Integer
    256 Integer -> Integer -> Integer
    forall a. Num a => a -> a -> a
    * Integer
    256 Integer -> Integer -> Integer
    forall a. Num a => a -> a -> a
    * Integer
    256)