我试图弄清楚如何在并发上下文中正确使用OpenSSL.Session API
例如,假设我要实现stunnel-style ssl-wrapper
,我希望具有以下基本框架结构,该结构可以实现幼稚full-duplex tcp-port-forwarder:
runProxy :: PortID -> AddrInfo -> IO ()
runProxy localPort@(PortNumber lpn) serverAddrInfo = do
listener <- listenOn localPort
forever $ do
(sClient, clientAddr) <- accept listener
let finalize sServer = do
sClose sServer
sClose sClient
forkIO $ do
tidToServer <- myThreadId
bracket (connectToServer serverAddrInfo) finalize $ \sServer -> do
-- execute one 'copySocket' thread for each data direction
-- and make sure that if one direction dies, the other gets
-- pulled down as well
bracket (forkIO (copySocket sServer sClient
`finally` killThread tidToServer))
(killThread) $ \_ -> do
copySocket sClient sServer -- "controlling" thread
where
-- |Copy data from source to dest until EOF occurs on source
-- Copying may also be aborted due to exceptions
copySocket :: Socket -> Socket -> IO ()
copySocket src dst = go
where
go = do
buf <- B.recv src 4096
unless (B.null buf) $ do
B.sendAll dst buf
go
-- |Create connection to given AddrInfo target and return socket
connectToServer saddr = do
sServer <- socket (addrFamily saddr) Stream defaultProtocol
connect sServer (addrAddress saddr)
return sServer
如何将上面的骨架转换为full-duplex ssl-wrapping tcp-forwarding proxy
?WRT对HsOpenSSL API提供的函数调用的并发/并行执行(在上述用例的上下文中)有何危险?
PS:我仍在努力全面理解如何使代码对异常和资源泄漏更为可靠。因此,尽管不是这个问题的主要焦点,但是如果您在上面的代码中发现了不好的地方,请发表评论。
11
我认为这对于SO来说可能是一个过于广泛的问题。
—
唐·斯图尔特
我会就此回复您:-)
—
Abhineet 2012年
链接到文档被破坏,这里是一个谁的工作:hackage.haskell.org/packages/archive/HsOpenSSL/0.10.2/doc/html/...
—
帕斯卡尔QYY