+ handshake ssl addr `catch` next ssl addr
+ where
+ handshake ∷ SSL.SSL → So.SockAddr → IO (SSL.SSL, So.SockAddr)
+ handshake ssl addr
+ = do SSL.accept ssl
+ return (ssl, addr)
+
+ next ∷ SSL.SSL
+ → So.SockAddr
+ → SSL.SomeSSLException
+ → IO (SSL.SSL, So.SockAddr)
+ next ssl addr e
+ = do I.hPutStrLn I.stderr
+ $ "Lucu: failed to accept an SSL connection from "
+ ⧺ show addr
+ ⧺ ":"
+ I.hPutStrLn I.stderr
+ $ show e
+ SSL.shutdown ssl SSL.Bidirectional
+ accept (ctx, soSelf)