2011-04-10 20:11:25 +00:00
|
|
|
-- |
|
|
|
|
-- Module : Network.TLS.Extra.Connection
|
|
|
|
-- License : BSD-style
|
|
|
|
-- Maintainer : Vincent Hanquez <vincent@snarc.org>
|
|
|
|
-- Stability : experimental
|
|
|
|
-- Portability : unknown
|
|
|
|
--
|
|
|
|
module Network.TLS.Extra.Connection
|
|
|
|
( connectionClient
|
|
|
|
) where
|
|
|
|
|
2011-04-11 19:03:49 +00:00
|
|
|
import Crypto.Random
|
2011-04-10 20:11:25 +00:00
|
|
|
import Control.Applicative ((<$>))
|
|
|
|
import Control.Exception
|
|
|
|
import Data.Char
|
|
|
|
|
|
|
|
import System.IO
|
|
|
|
|
|
|
|
import Network.BSD
|
|
|
|
import Network.Socket
|
|
|
|
import Network.TLS
|
|
|
|
|
|
|
|
-- | open a TCP client connection to a destination and port description (number or name)
|
|
|
|
--
|
2011-04-11 19:03:49 +00:00
|
|
|
connectionClient :: CryptoRandomGen g => String -> String -> TLSParams -> g -> IO TLSCtx
|
2011-04-10 20:11:25 +00:00
|
|
|
connectionClient s p params rng = do
|
|
|
|
pn <- if and $ map isDigit $ p
|
|
|
|
then return $ fromIntegral $ (read p :: Int)
|
|
|
|
else servicePort <$> getServiceByName p "tcp"
|
|
|
|
he <- getHostByName s
|
|
|
|
|
|
|
|
h <- bracketOnError (socket AF_INET Stream defaultProtocol) sClose $ \sock -> do
|
|
|
|
connect sock (SockAddrInet pn (head $ hostAddresses he))
|
|
|
|
socketToHandle sock ReadWriteMode
|
|
|
|
client params rng h
|