Hi folks,
I’ve seen various requests for non-blocking OpenSSL support. As a
maintainer of a non-blocking event library this was crucial for the
stuff I
was doing. I developed a C extension which uses some pretty crazy hacks
to
patch non-blocking support into the existing OpenSSL C extension.
As this can benefit people who aren’t using my event library, I’ve gone
ahead and rolled this functionality into its own gem, which works on
1.8.6,
1.8.7, and 1.9.1:
github: GitHub - tarcieri/openssl-nonblock: Non-blocking I/O support for Ruby OpenSSL
rubyforge: http://rubyforge.org/frs/shownotes.php?release_id=31150
This gem adds an additional four methods to OpenSSL::SSL::SSLSocket:
connect_nonblock, accept_nonblock, read_nonblock, and write_nonblock.
It
also adds an additional two exceptions: OpenSSL::SSL::ReadAgain and
OpenSSL::SSL::WriteAgain to handle cases where the system isn’t ready to
perform the given I/O request.
I’ve seen some patches for this on the 1.9 Redmine (e.g.
http://redmine.ruby-lang.org/issues/show/814) but they aren’t
comprehensive
and don’t address connect_nonblock and accept_nonblock.
I hope these issues get addressed by ruby-core eventually, but with this
gem
you can have non-blocking SSL I/O today.
And if you’re interested in non-blocking I/O in general, you might want
to
check out my event framework:
Enjoy!