From a579d8bf6818cd979efc441f9bcec849b2d37b3e Mon Sep 17 00:00:00 2001 From: gotoyuzo Date: Tue, 15 Feb 2005 17:50:47 +0000 Subject: * ext/openssl/ossl_ssl.c (ossl_ssl_read, ossl_ssl_write): should call rb_sys_fail instead of rasing SSLError if SSL_ERROR_SYSCALL occured. * ext/openssl/lib/openssl/buffering.rb (Buffering#fill_rbuff): should rescue Errno::EAGAIN. * ext/openssl/lib/openssl/buffering.rb (Buffering#each): fix typo. suggested by Brian Ollenberger. * ext/openssl/lib/openssl/ssl.rb: set non-blocking flag to the underlying IO. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7974 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/openssl/lib/openssl/buffering.rb | 4 +++- ext/openssl/lib/openssl/ssl.rb | 10 ++++++++++ ext/openssl/ossl_ssl.c | 4 +++- 3 files changed, 16 insertions(+), 2 deletions(-) (limited to 'ext/openssl') diff --git a/ext/openssl/lib/openssl/buffering.rb b/ext/openssl/lib/openssl/buffering.rb index 31dcdf1f9a..7ad12d7203 100644 --- a/ext/openssl/lib/openssl/buffering.rb +++ b/ext/openssl/lib/openssl/buffering.rb @@ -32,6 +32,8 @@ module Buffering @rbuffer = "" unless defined? @rbuffer begin @rbuffer << self.sysread(BLOCK_SIZE) + rescue Errno::EAGAIN + retry rescue EOFError @eof = true end @@ -84,7 +86,7 @@ module Buffering end def each(eol=$/) - while line = self.gets(eol?) + while line = self.gets(eol) yield line end end diff --git a/ext/openssl/lib/openssl/ssl.rb b/ext/openssl/lib/openssl/ssl.rb index 9c31fa73cd..7f61fc2a62 100644 --- a/ext/openssl/lib/openssl/ssl.rb +++ b/ext/openssl/lib/openssl/ssl.rb @@ -16,6 +16,7 @@ require "openssl" require "openssl/buffering" +require "fcntl" module OpenSSL module SSL @@ -49,9 +50,18 @@ module OpenSSL end end + module Nonblock + def initialize(*args) + flag = @io.fcntl(Fcntl::F_GETFL) | File::NONBLOCK + @io.fcntl(Fcntl::F_SETFL, flag) + super + end + end + class SSLSocket include Buffering include SocketForwarder + include Nonblock def post_connection_check(hostname) check_common_name = true diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c index 89c4ec1c6c..e85430e859 100644 --- a/ext/openssl/ossl_ssl.c +++ b/ext/openssl/ossl_ssl.c @@ -517,7 +517,7 @@ ossl_ssl_read(int argc, VALUE *argv, VALUE self) continue; case SSL_ERROR_SYSCALL: if(ERR_peek_error() == 0 && nread == 0) rb_eof_error(); - ossl_raise(eSSLError, "SSL_read: %s", strerror(errno)); + rb_sys_fail(0); default: ossl_raise(eSSLError, "SSL_read:"); } @@ -556,6 +556,8 @@ ossl_ssl_write(VALUE self, VALUE str) case SSL_ERROR_WANT_READ: rb_thread_schedule(); continue; + case SSL_ERROR_SYSCALL: + rb_eof_error(); default: ossl_raise(eSSLError, "SSL_write:"); } -- cgit v1.2.3