-- | -- Module : Network.Socks5.Conf -- License : BSD-style -- Maintainer : Vincent Hanquez <vincent@snarc.org> -- Stability : experimental -- Portability : unknown -- -- typical SOCKS configuration module Network.Socks5.Conf ( SocksConf(..) , socksHost , socksPort , defaultSocksConf , defaultSocksConfFromSockAddr ) where import Network.Socket import Network.Socks5.Types (SocksAddress(..), SocksHostAddress(..), SocksVersion(..)) import qualified Data.ByteString.Char8 as BC -- | SOCKS configuration structure. -- this structure will be extended in future to support authentification. -- use defaultSocksConf to create new record. data SocksConf = SocksConf { socksServer :: SocksAddress -- ^ SOCKS Address , socksVersion :: SocksVersion -- ^ SOCKS version to use } -- | SOCKS Host socksHost :: SocksConf -> SocksHostAddress socksHost conf = ha where (SocksAddress ha _) = socksServer conf -- | SOCKS Port socksPort :: SocksConf -> PortNumber socksPort conf = port where (SocksAddress _ port) = socksServer conf -- | defaultSocksConf create a new record, making sure -- API remains compatible when the record is extended. defaultSocksConf host port = SocksConf server SocksVer5 where server = SocksAddress haddr port haddr = SocksAddrDomainName $ BC.pack host -- | same as defaultSocksConf except the server address is determined from a 'SockAddr' -- -- A unix SockAddr will raises an error. Only Inet and Inet6 types supported defaultSocksConfFromSockAddr sockaddr = SocksConf server SocksVer5 where server = SocksAddress haddr port (haddr,port) = case sockaddr of SockAddrInet p h -> (SocksAddrIPV4 h, p) SockAddrInet6 p _ h _ -> (SocksAddrIPV6 h, p) _ -> error "unsupported unix sockaddr type"