[haskell] एक टीएलएस सर्वर को लागू करने के लिए HsOpenSSL API का उचित उपयोग


Answers

Question

मैं एक समवर्ती संदर्भ में 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 कैसे full-duplex ssl-wrapping tcp-forwarding proxy ? एचएसओपेनएसएसएल एपीआई द्वारा प्रदान की गई फ़ंक्शन कॉल के समवर्ती / समानांतर निष्पादन (उपरोक्त उपयोग-मामले के संदर्भ में) के लिए डब्लूआरटी खतरे कहां हैं?

पीएस: मैं अभी भी पूरी तरह समझने के लिए संघर्ष कर रहा हूं कि अपवाद और संसाधन-रिसाव के लिए कोड को मजबूत wrt कैसे बनाया जाए। इसलिए, इस सवाल का प्राथमिक ध्यान न होने पर, यदि आप ऊपर दिए गए कोड में कुछ बुरा देखते हैं, तो कृपया एक टिप्पणी छोड़ दें।






Links