diff options
-rw-r--r-- | ext/openssl/extconf.rb | 3 | ||||
-rw-r--r-- | ext/openssl/ossl_ssl.c | 41 | ||||
-rw-r--r-- | test/openssl/test_ssl.rb | 12 |
3 files changed, 56 insertions, 0 deletions
diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb index ad92a287a6..b01ef73f3a 100644 --- a/ext/openssl/extconf.rb +++ b/ext/openssl/extconf.rb @@ -84,6 +84,9 @@ engines.each { |name| OpenSSL.check_func_or_macro("ENGINE_load_#{name}", "openssl/engine.h") } +OpenSSL.check_func_or_macro("SSL_CTX_set_read_ahead", "openssl/ssl.h") +OpenSSL.check_func_or_macro("SSL_CTX_get_read_ahead", "openssl/ssl.h") + # added in 0.9.8X have_func("EVP_CIPHER_CTX_new") have_func("EVP_CIPHER_CTX_free") diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c index 5876946183..d65888673d 100644 --- a/ext/openssl/ossl_ssl.c +++ b/ext/openssl/ossl_ssl.c @@ -1074,6 +1074,45 @@ ossl_sslctx_set_ecdh_curves(VALUE self, VALUE arg) /* * call-seq: + * ctx.read_ahead -> true or false + */ +static VALUE +ossl_sslctx_get_read_ahead(VALUE self) +{ +#if defined(HAVE_SSL_CTX_GET_READ_AHEAD) + SSL_CTX *ctx; + + GetSSLCTX(self, ctx); + + return SSL_CTX_get_read_ahead(ctx) ? Qtrue : Qfalse; +#else + return Qfalse; +#endif +} + +/* + * call-seq: + * ctx.read_ahead = boolean -> boolean + */ +#if defined(HAVE_SSL_CTX_SET_READ_AHEAD) +static VALUE +ossl_sslctx_set_read_ahead(VALUE self, VALUE boolean) +{ + SSL_CTX *ctx; + + GetSSLCTX(self, ctx); + rb_check_frozen(self); + + SSL_CTX_set_read_ahead(ctx, RTEST(boolean)); + + return boolean; +} +#else +#define ossl_sslctx_set_read_ahead rb_f_notimplement +#endif + +/* + * call-seq: * ctx.security_level -> Integer * * Returns the security level for the context. @@ -2449,6 +2488,8 @@ Init_ossl_ssl(void) rb_define_method(cSSLContext, "ciphers", ossl_sslctx_get_ciphers, 0); rb_define_method(cSSLContext, "ciphers=", ossl_sslctx_set_ciphers, 1); rb_define_method(cSSLContext, "ecdh_curves=", ossl_sslctx_set_ecdh_curves, 1); + rb_define_method(cSSLContext, "read_ahead", ossl_sslctx_get_read_ahead, 0); + rb_define_method(cSSLContext, "read_ahead=", ossl_sslctx_set_read_ahead, 1); rb_define_method(cSSLContext, "security_level", ossl_sslctx_get_security_level, 0); rb_define_method(cSSLContext, "security_level=", ossl_sslctx_set_security_level, 1); diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb index b1dc2233d6..f3ec8b60b5 100644 --- a/test/openssl/test_ssl.rb +++ b/test/openssl/test_ssl.rb @@ -1246,6 +1246,18 @@ end skip "FIXME: SSLContext#key= currently does not raise because SSL_CTX_use_certificate() is delayed" end + def test_read_ahead + ctx = OpenSSL::SSL::SSLContext.new + assert_equal(false, ctx.read_ahead) + begin + ctx.read_ahead = true + rescue NotImplementedError + assert_equal(false, ctx.read_ahead) + return + end + assert_equal(true, ctx.read_ahead) + end + private def start_server_version(version, ctx_proc=nil, server_proc=nil, &blk) |