同時コンテキストで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
ますか?HsOpenSSL APIによって提供される関数呼び出しの同時/並列実行(上記のユースケースのコンテキスト)に対するWRTの危険性はどこにありますか?
PS:例外やリソースリークに対してコードを堅牢なwrtにする方法を完全に理解するのにまだ苦労しています。したがって、この質問の主な焦点ではありませんが、上記のコードに問題があることに気付いた場合は、コメントを残してください。
11
これはSOにとっては広すぎる質問かもしれません。
—
Don Stewart、
これについては後で
—
連絡
:ドキュメントへのリンクが壊れている、ここで働いているものですhackage.haskell.org/packages/archive/HsOpenSSL/0.10.2/doc/html/...を
—
パスカルQYY
私は似たような(
full-duplex ssl-rewrapping tcp-forwarding
)を作成しましたが、代わりにNetwork.TLS
(パッケージtls
)を使用しました。そしてそれは醜かった。興味があれば、ここで見つけることができます。