module Network.Socks5
( socksConnectAddr
, socksConnectName
) where
import Control.Monad
import Network.Socket (Socket, SockAddr(..), PortNumber, connect)
import Network.Socks5.Command
import Network.Socks5.Types
withSocks socket sockaddr f = do
connect socket sockaddr
r <- socks5Establish socket [SocksMethodNone]
when (r == SocksMethodNotAcceptable) $ error "cannot connect with no socks method of authentication"
f
socksConnectAddr :: Socket -> SockAddr -> SockAddr -> IO ()
socksConnectAddr socket sockserver destaddr = withSocks socket sockserver $ do
case destaddr of
SockAddrInet p h -> socks5ConnectIPV4 socket h p >> return ()
SockAddrInet6 p _ h _ -> socks5ConnectIPV6 socket h p >> return ()
SockAddrUnix _ -> error "unsupported unix sockaddr type"
socksConnectName :: Socket -> SockAddr -> String -> PortNumber -> IO ()
socksConnectName socket sockserver destination port = withSocks socket sockserver $ do
_ <- socks5ConnectDomainName socket destination port
return ()