Estoy tratando de encontrar la manera de utilizar correctamente la API OpenSSL.Session en un contexto concurrenteEl uso adecuado de la API HsOpenSSL para implementar un servidor TLS
P. ej Asumo que quiero implementar un stunnel-style ssl-wrapper
, me gustaría esperar a tener la siguiente estructura de esqueleto básico, que implementa una ingenua full-duplex tcp-port-forwarder:
runProxy :: PortID -> AddrInfo -> IO()
runProxy [email protected](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
¿Cómo transformar el esqueleto anterior en un full-duplex ssl-wrapping tcp-forwarding proxy
? ¿Dónde están los peligros W.R.T a la ejecución simultánea/paralela (en el contexto del caso de uso anterior) de las llamadas a funciones proporcionadas por la API HsOpenSSL?
PD: Todavía estoy luchando por comprender por completo cómo hacer que el código sea robusto w.r.t. a excepciones y pérdidas de recursos. Entonces, aunque no sea el foco principal de esta pregunta, si nota algo malo en el código anterior, por favor deje un comentario.
Creo que esto podría ser una pregunta demasiado amplia para el SO. –
Me pondré en contacto con usted en este :-) – Abhineet
el enlace al documento está roto, aquí está el que está trabajando: http://hackage.haskell.org/packages/archive/HsOpenSSL/0.10.2/doc /html/OpenSSL-Session.html –