[Python-Dev] Memory BIO for _ssl

Antoine Pitrou antoine at python.org
Mon Jul 7 01:49:23 CEST 2014


Le 05/07/2014 14:04, Geert Jansen a écrit :
> Since I need this for my Gruvi async framework, I want to volunteer to
> write a patch. It should be useful as well to Py3K's asyncio and other
> async frameworks. It would be good to get some feedback before I start
> on this.

Thanks for volunteering! This would be a very welcome addition.

> I was thinking of the following approach:
>   * Add a new type to _ssl: PySSLMemoryBIO
>   * PySSLMemoryBIO has a public constructor, and at least the following
> methods: puts() puts_eof() and gets(). I aligned the terminology with
> the method names in OpenSSL. puts_eof() does a
> BIO_set_mem_eof_return(-1).

Hmm... I haven't looked in detail, but at least I'd like those to be 
called read() and write() (and write_eof()), like most other I/O methods 
in Python.
Or if we want to avoid confusion, add an explicit suffix (write_incoming?).

>   * All accesses to the memory BIO as non-blocking.

Sounds sensible indeed (otherwise what would they wait for?).

>   * Update PySSLSocket to add support for SSL_set_bio(). The fact that
> the memory BIO is non-blocking makes it easier. None of the logic in
> and around check_socket_and_wait_for_timeout() for example needs to be
> changed. For the parts that deal with the socket directly, and that
> are in the code path for non-blocking IO, I think the preference would
> be i) try to change the code to use BIO methods that works for both
> sockets and memory BIOs, and ii) if not possible, special case it.

That sounds good in the principle. I don't enough about memory BIOs to 
know whether you will have issues doing so :-)

>   * At this point the PySSLSocket name is a bit of a misnomer as it
> does more than sockets. Probably not an issue.


>   * Add a method _wrap_bio(rbio, wbio, ...) to _SSLContext.
>   * Expose the low-level methods via the "ssl" module.
> Creating an SSLSocket with a memory BIO would work something like this:
>    context = SSLContext()
>    rbio = ssl.MemoryBIO()
>    wbio = ssl.MemoryBIO()
>    sslsock = ssl.wrap_bio(rbio, wbio)

The one thing I find confusing is the r(ead)bio / w(rite)bio terminology 
(because you actually read and write from both). Perhaps incoming and 
outgoing would be clearer.



More information about the Python-Dev mailing list