webserver-0.2.0: Network/Web/Utils.hs
{-|
Utility functions.
-}
module Network.Web.Utils where
import Data.List
import Network.Socket
import Network.URI
import System.IO
{-|
Getting a hostname from 'URI'.
-}
uriHostName :: URI -> String
uriHostName uri = maybe "" uriRegName $ uriAuthority uri
{-|
Making a URL string from 'URI' without port.
-}
toURLwoPort :: URI -> String
toURLwoPort uri = uriScheme uri ++ "//" ++ uriHostName uri ++ uriPath uri ++ uriQuery uri
----------------------------------------------------------------
{-|
TCP connection information.
-}
data TCPInfo = TCPInfo {
-- | Local IP address
myAddr :: HostName
-- | Local port number
, myPort :: ServiceName
-- | Remote IP address
, peerAddr :: HostName
-- | Remote port number
, peerPort :: ServiceName
} deriving (Eq,Show)
{-|
Getting TCP connection information.
-}
getTCPInfo :: Socket -> IO TCPInfo
getTCPInfo sock = do
(Just vMyAddr, Just vMyPort) <- getSocketName sock >>= getInfo
(Just vPeerAddr, Just vPeerPort) <- getPeerName sock >>= getInfo
return TCPInfo { myAddr = strip vMyAddr
, myPort = vMyPort
, peerAddr = strip vPeerAddr
, peerPort = vPeerPort}
where
getInfo = getNameInfo [NI_NUMERICHOST, NI_NUMERICSERV] True True
strip x
| "::ffff:" `isPrefixOf` x = drop 7 x
| otherwise = x