Tôi đang cố gắng tìm ra cách sử dụng API OpenSSL.Session đúng cách trong ngữ cảnh đồng thời
Ví dụ, giả sử tôi muốn thực hiện một stunnel-style ssl-wrapper
, tôi hy vọng sẽ có cấu trúc bộ xương cơ bản sau, thực hiện một sự ngây thơ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
Làm thế nào để tôi biến đổi bộ xương trên thành một full-duplex ssl-wrapping tcp-forwarding proxy
? Đâu là mối nguy hiểm WRT đối với việc thực thi đồng thời / song song (trong bối cảnh của trường hợp sử dụng ở trên) của các lệnh gọi hàm được cung cấp bởi API HsOpenSSL?
Tái bút: Tôi vẫn đang cố gắng để hiểu đầy đủ về cách làm cho mã mạnh mẽ trở thành ngoại lệ và rò rỉ tài nguyên. Vì vậy, mặc dù không phải là trọng tâm chính của câu hỏi này, nếu bạn nhận thấy điều gì đó không tốt trong đoạn mã trên, vui lòng để lại nhận xét.
full-duplex ssl-rewrapping tcp-forwarding
), nhưng nó được sử dụng Network.TLS
(gói tls
) thay thế. Và nó thật xấu xí. Bạn có thể tìm thấy nó ở đây , nếu ở tất cả quan tâm.