Eşzamanlı bağlamda OpenSSL.Session API nasıl kullanılacağını anlamaya çalışıyorum
Örneğin, uygulamak istediğimi varsayalım stunnel-style ssl-wrapper
, bir saf uygulayan aşağıdaki temel iskelet yapısına sahip olmayı beklerdimfull-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
Yukarıdaki iskeleti nasıl a'ya dönüştürebilirim full-duplex ssl-wrapping tcp-forwarding proxy
? HsOpenSSL API tarafından sağlanan işlev çağrılarının WRT'nin eşzamanlı / paralel yürütülmesine (yukarıdaki kullanım durumu bağlamında) neden olduğu tehlikeler nelerdir?
PS: Hala istisnalar ve kaynak sızıntıları için kodu sağlam wrt nasıl tam olarak anlamak için mücadele ediyorum. Bu nedenle, bu sorunun birincil odağı olmasa da, yukarıdaki kodda kötü bir şey fark ederseniz, lütfen bir yorum bırakın.
full-duplex ssl-rewrapping tcp-forwarding
), ama bunun yerine Network.TLS
(paket tls
) kullandı. Ve çirkindi. Eğer ilgileniyorsanız, burada bulabilirsiniz .