ฉันกำลังพยายามหาวิธีการใช้OpenSSL.Session API อย่างถูกต้องในบริบทที่เกิดขึ้นพร้อมกัน
เช่นสมมติว่าฉันต้องการใช้ a 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
ฉันจะเปลี่ยนโครงกระดูกข้างต้นเป็น a ได้full-duplex ssl-wrapping tcp-forwarding proxy
อย่างไร WRT อันตรายที่จะดำเนินการพร้อมกัน / ขนานอยู่ที่ไหน (ในบริบทของกรณีการใช้งานด้านบน) ของการเรียกใช้ฟังก์ชันที่ HsOpenSSL API ให้มา
PS: ฉันยังคงดิ้นรนอย่างเต็มที่ที่จะเข้าใจวิธีการทำให้รหัส wrt ที่แข็งแกร่งเพื่อข้อยกเว้นและการรั่วไหลของทรัพยากร ดังนั้นแม้ว่าจะไม่ได้เป็นจุดสนใจหลักของคำถามนี้หากคุณสังเกตเห็นสิ่งที่ไม่ดีในรหัสข้างต้นโปรดแสดงความคิดเห็น
full-duplex ssl-rewrapping tcp-forwarding
) แต่ใช้Network.TLS
(แพ็คเกจtls
) แทน และมันก็น่าเกลียด คุณสามารถค้นหาได้ที่นี่หากสนใจ