wai-app-file-cgi-0.0.0: Network/Wai/Application/Classic/Utils.hs
module Network.Wai.Application.Classic.Utils where
import Control.Applicative
import Network.Socket (getNameInfo, SockAddr, NameInfoFlag(..))
import Data.Maybe
import Data.List (isPrefixOf)
{-|
A type for IP address in numeric string representation.
-}
type NumericAddress = String
{-|
Convert 'SockAddr' to 'NumericAddress'. If the address is
an IPv4-embedded IPv6 address, the IPv4 is extracted.
-}
getPeerAddr :: SockAddr -> IO NumericAddress
getPeerAddr sa = strip . fromJust . fst <$> getInfo sa
where
getInfo = getNameInfo [NI_NUMERICHOST, NI_NUMERICSERV] True True
strip x
| "::ffff:" `isPrefixOf` x = drop 7 x
| otherwise = x