{-| 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