[Python-Dev] ssl module, non-blocking sockets and asyncore integration

Nick Coghlan ncoghlan at gmail.com
Wed Sep 17 23:47:03 CEST 2008


Bill Janssen wrote:
> Jean-Paul Calderone <exarkun at divmod.com> wrote:
> 
>> On Wed, 17 Sep 2008 10:40:01 PDT, Bill Janssen <janssen at parc.com> wrote:
>>> Ah, now I remember.  It seems that sometimes when SSL_ERROR_WANT_READ
>>> was returned, things would block; that is, the "handle_read" method on
>>> asyncore.dispatcher was never called again, so the SSLSocket.recv()
>>> method was never re-called.  There are several levels of buffering going
>>> on, and I never figured out just why that was.  This (very rare) re-call
>>> of "read" is to handle that.
>>>
>> You certainly do need to call read again if OpenSSL fails an SSL_read with
>> a want-read error, but in asyncore, you don't want to do it right away,
>> you want to wait until the socket becomes readable again, otherwise you *do*
>> block waiting for bytes from the network.  See the SSL support in Twisted
>> for an example of the correct way to handle this.
>>
>> Jean-Paul
> 
> Yes, I understand, and that's how I started out.  The bug we were seeing
> was that "handle_read" wasn't being called again by asyncore.

It's probably worth sticking a comment in the code explaining why we're
taking the risk of temporarily blocking on a non-blocking socket (i.e.
until someone figures out how to reproduce that bug reliably so that a
more correct fix can be devised).

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia
---------------------------------------------------------------
            http://www.boredomandlaziness.org


More information about the Python-Dev mailing list