module Network.HTTP.Client.OpenSSL
( opensslManagerSettings
, withOpenSSL
) where
import Network.HTTP.Client
import Network.HTTP.Client.Internal
import Control.Exception
import Network.Socket (HostAddress)
import OpenSSL
import qualified Network.Socket as N
import qualified OpenSSL.Session as SSL
defaultMakeContext :: IO SSL.SSLContext
defaultMakeContext = SSL.context
opensslManagerSettings :: IO SSL.SSLContext -> ManagerSettings
opensslManagerSettings mkContext = defaultManagerSettings
{ managerTlsConnection = do
ctx <- mkContext
return $ \_ha host port -> do
let hints = N.defaultHints
{ N.addrFlags = [N.AI_ADDRCONFIG, N.AI_NUMERICSERV]
, N.addrFamily = N.AF_INET
, N.addrSocketType = N.Stream
}
(addrInfo:_) <- N.getAddrInfo (Just hints) (Just host) (Just $ show port)
let family = N.addrFamily addrInfo
let socketType = N.addrSocketType addrInfo
let protocol = N.addrProtocol addrInfo
let address = N.addrAddress addrInfo
bracketOnError (N.socket family socketType protocol) (N.close)
$ \sock -> do
N.connect sock address
ssl <- SSL.connection ctx sock
SSL.connect ssl
makeConnection
(SSL.read ssl 32752)
(SSL.write ssl)
(N.close sock)
}