* ext/openssl/lib/openssl/ssl.rb (module OpenSSL): move

SSLSocket#sysclose to Ruby.

* ext/openssl/ossl_ssl.c (ossl_ssl_close): ditto

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51497 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
tenderlove 2015-08-05 23:17:33 +00:00
Родитель 175862843c
Коммит ff7eb4c656
3 изменённых файлов: 25 добавлений и 15 удалений

Просмотреть файл

@ -1,3 +1,10 @@
Thu Aug 6 08:15:49 2015 Aaron Patterson <tenderlove@ruby-lang.org>
* ext/openssl/lib/openssl/ssl.rb (module OpenSSL): move
SSLSocket#sysclose to Ruby.
* ext/openssl/ossl_ssl.c (ossl_ssl_close): ditto
Thu Aug 6 07:57:21 2015 Aaron Patterson <tenderlove@ruby-lang.org> Thu Aug 6 07:57:21 2015 Aaron Patterson <tenderlove@ruby-lang.org>
* ext/openssl/lib/openssl/ssl.rb (module OpenSSL): move nonblock * ext/openssl/lib/openssl/ssl.rb (module OpenSSL): move nonblock

Просмотреть файл

@ -291,6 +291,16 @@ module OpenSSL
end end
end end
# call-seq:
# ssl.sysclose => nil
#
# Shuts down the SSL connection and prepares it for another connection.
def sysclose
return if closed?
stop
io.close if sync_close
end
## ##
# Perform hostname verification after an SSL connection is established # Perform hostname verification after an SSL connection is established
# #

Просмотреть файл

@ -68,7 +68,6 @@ static VALUE eSSLErrorWaitWritable;
#define ossl_ssl_get_io(o) rb_iv_get((o),"@io") #define ossl_ssl_get_io(o) rb_iv_get((o),"@io")
#define ossl_ssl_get_ctx(o) rb_iv_get((o),"@context") #define ossl_ssl_get_ctx(o) rb_iv_get((o),"@context")
#define ossl_ssl_get_sync_close(o) rb_iv_get((o),"@sync_close")
#define ossl_ssl_get_x509(o) rb_iv_get((o),"@x509") #define ossl_ssl_get_x509(o) rb_iv_get((o),"@x509")
#define ossl_ssl_get_key(o) rb_iv_get((o),"@key") #define ossl_ssl_get_key(o) rb_iv_get((o),"@key")
@ -1590,31 +1589,25 @@ ossl_ssl_write_nonblock(int argc, VALUE *argv, VALUE self)
/* /*
* call-seq: * call-seq:
* ssl.sysclose => nil * ssl.stop => nil
* *
* Shuts down the SSL connection and prepares it for another connection. * Stops the SSL connection and prepares it for another connection.
*/ */
static VALUE static VALUE
ossl_ssl_close(VALUE self) ossl_ssl_stop(VALUE self)
{ {
SSL *ssl; SSL *ssl;
VALUE io;
/* ossl_ssl_data_get_struct() is not usable here because it may return /* ossl_ssl_data_get_struct() is not usable here because it may return
* from this function; */ * from this function; */
GetSSL(self, ssl); GetSSL(self, ssl);
io = ossl_ssl_get_io(self); if (ssl) {
if (!RTEST(rb_funcall(io, rb_intern("closed?"), 0))) { ossl_ssl_shutdown(ssl);
if (ssl) { SSL_free(ssl);
ossl_ssl_shutdown(ssl);
SSL_free(ssl);
}
DATA_PTR(self) = NULL;
if (RTEST(ossl_ssl_get_sync_close(self)))
rb_funcall(io, rb_intern("close"), 0);
} }
DATA_PTR(self) = NULL;
return Qnil; return Qnil;
} }
@ -2287,7 +2280,7 @@ Init_ossl_ssl(void)
rb_define_private_method(cSSLSocket, "sysread_nonblock", ossl_ssl_read_nonblock, -1); rb_define_private_method(cSSLSocket, "sysread_nonblock", ossl_ssl_read_nonblock, -1);
rb_define_method(cSSLSocket, "syswrite", ossl_ssl_write, 1); rb_define_method(cSSLSocket, "syswrite", ossl_ssl_write, 1);
rb_define_private_method(cSSLSocket, "syswrite_nonblock", ossl_ssl_write_nonblock, -1); rb_define_private_method(cSSLSocket, "syswrite_nonblock", ossl_ssl_write_nonblock, -1);
rb_define_method(cSSLSocket, "sysclose", ossl_ssl_close, 0); rb_define_private_method(cSSLSocket, "stop", ossl_ssl_stop, 0);
rb_define_method(cSSLSocket, "cert", ossl_ssl_get_cert, 0); rb_define_method(cSSLSocket, "cert", ossl_ssl_get_cert, 0);
rb_define_method(cSSLSocket, "peer_cert", ossl_ssl_get_peer_cert, 0); rb_define_method(cSSLSocket, "peer_cert", ossl_ssl_get_peer_cert, 0);
rb_define_method(cSSLSocket, "peer_cert_chain", ossl_ssl_get_peer_cert_chain, 0); rb_define_method(cSSLSocket, "peer_cert_chain", ossl_ssl_get_peer_cert_chain, 0);