[Python-Dev] ssl module integration with asyncore

Bill Janssen janssen at parc.com
Thu Nov 29 00:26:24 CET 2007


> I tried to write a simple asyncore-based server code, then I used a
> simple client to establish a connection with it.
> Once the client is connected server raises the following exception:

I think this is a bug.  Thanks!

The issue is that the internal call to do_handshake() doesn't handle
non-blocking sockets properly.

You can work around the bug like this:

--- snippet ---
import asyncore, asynchat, socket, ssl, select

class Handler(asyncore.dispatcher):

    def __init__(self, conn):
        asyncore.dispatcher.__init__(self, conn)
        self.socket = ssl.wrap_socket(conn, server_side=True,
                                      certfile='keycert.pem',
                                      do_handshake_on_connect=False)
        while True:
            try:
                self.socket.do_handshake()
                break
            except ssl.SSLError, err:
                if err.args[0] == ssl.SSL_ERROR_WANT_READ:
                    select.select([self.socket], [], [])
                elif err.args[0] == ssl.SSL_ERROR_WANT_WRITE:
                    select.select([], [self.socket], [])
                else:
                    raise
        self.send('hi there')
--- /snippet ---

Bill



More information about the Python-Dev mailing list