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



0 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 कैसे बनाया जाए। इसलिए, इस सवाल का प्राथमिक ध्यान न होने पर, यदि आप ऊपर दिए गए कोड में कुछ बुरा देखते हैं, तो कृपया एक टिप्पणी छोड़ दें।




Related