Index: Lib/test/test_ssl.py =================================================================== --- Lib/test/test_ssl.py (revision 66507) +++ Lib/test/test_ssl.py (working copy) @@ -381,14 +381,48 @@ asyncore.dispatcher_with_send.__init__(self, conn) self.socket = ssl.wrap_socket(conn, server_side=True, certfile=certfile, - do_handshake_on_connect=True) + suppress_ragged_eofs=False, + do_handshake_on_connect=False) + self.ssl_accepting = True - def readable(self): - if isinstance(self.socket, ssl.SSLSocket): - while self.socket.pending() > 0: - self.handle_read_event() - return True + def do_ssl_handshake(self): + try: + self.socket.do_handshake() + self.ssl_accepting = False + except ssl.SSLError, err: + if err.args[0] in (ssl.SSL_ERROR_WANT_READ, ssl.SSL_ERROR_WANT_WRITE): + return + raise + def handle_read_event(self): + if self.ssl_accepting: + self.do_ssl_handshake() + else: + asyncore.dispatcher.handle_read_event(self) + + def handle_write_event(self): + if self.ssl_accepting: + self.do_ssl_handshake() + else: + asyncore.dispatcher.handle_write_event(self) + + def send(self, data): + try: + return asyncore.dispatcher.send(self, data) + except ssl.SSLError, err: + if err.args[0] == ssl.SSL_ERROR_EOF: + return 0 + raise + + def recv(self, buffer_size): + try: + return asyncore.dispatcher.recv(self, buffer_size) + except ssl.SSLError, err: + if err.args[0] == ssl.SSL_ERROR_EOF: + self.handle_close() + return '' + raise + def handle_read(self): data = self.recv(1024) self.send(data.lower())