[tor-commits] [ooni-probe/master] Add method handleWantWrite() for resending already sent data over the

art at torproject.org art at torproject.org
Tue Apr 30 13:01:43 UTC 2013


commit 80a1dfedd7d266e83d70080bae8f73192dd09bfb
Author: Isis Lovecruft <isis at torproject.org>
Date:   Thu Feb 28 04:24:07 2013 +0000

    Add method handleWantWrite() for resending already sent data over the
    connection, if OpenSSL's memory BIO state machine reports this error, and also
    jump to the SSL_ERROR_WANT_READ handler if at any point that error is raised.
---
 nettests/experimental/tls_handshake.py |   52 ++++++++++++++++++++++++++++++++
 1 files changed, 52 insertions(+), 0 deletions(-)

diff --git a/nettests/experimental/tls_handshake.py b/nettests/experimental/tls_handshake.py
index 7e71579..dc046a8 100644
--- a/nettests/experimental/tls_handshake.py
+++ b/nettests/experimental/tls_handshake.py
@@ -421,6 +421,58 @@ class TLSHandshakeTest(nettest.NetTestCase):
                 handleWantWrite(connection)
             return connection
 
+        def handleWantWrite(connection):
+            """
+            See :func:`handleWantRead`.
+            """
+            try:
+                while connection.want_write():
+                    log.debug("Connection to %s HAS want_write" % host)
+                    sleep(1)
+                    resent = connection.send("o\r\n")
+                    log.debug("Sent: %d" % resent)
+                    log.debug("State: %s" % connection.state_string())
+            except SSL.WantReadError, wre:
+                log.debug("Got WantReadError while handling want_write")
+                log.debug("WantReadError: %s" % wre.message)
+                log.debug("Switching to handleWantRead()...")
+                handleWantRead(connection)
+            return connection
+
+        def doHandshake(connection):
+            """
+            Attemp a TLS/SSL handshake with the host.
+
+            If, after the first attempt at handshaking, OpenSSL's memory BIO
+            state machine does not report success, then try reading and
+            writing from the connection, and handle any SSL_ERROR_WANT_READ or
+            SSL_ERROR_WANT_WRITE which occurs.
+
+            If multiple want_reads occur, then try renegotiation with the
+            host, and start over. If multiple want_writes occur, then it is
+            possible that the connection has timed out, and move on to the
+            connectionShutdown step.
+
+            @param connection: A :class:`OpenSSL.SSL.Connection`.
+            @ivar peername: The host IP address, as reported by getpeername().
+            @ivar peerport: The host port, reported by getpeername().
+            @ivar sent: The number of bytes sent to to the remote host.
+            @ivar received: The number of bytes received from the remote host.
+            @ivar _read_buffer: An integer for the max bytes that can be read
+                                from the connection.
+            @returns: The :param:connection with handshake completed, else
+                      the unhandled error that was raised.
+            """
+            peername, peerport = connection.getpeername()
+
+            log.msg("Attempting handshake: %s" % peername)
+            connection.do_handshake()
+            log.debug("State: %s" % connection.state_string())
+            if connection.state_string() == \
+                    'SSL negotiation finished successfully':
+                ## jump to handshakeSuccessful and get certchain
+                return connection
+
             else:
                 log.msg("State: %s" % connection.state_string())
                 log.msg("Transmitted %d bytes" % connection.send("o\r\n"))





More information about the tor-commits mailing list