From 8769853c6de8e7b4325e4d8bd3729acc8dd25b40 Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Mon, 22 Apr 2024 20:48:40 +1200 Subject: [PATCH] Introduce basic support for `close_read` and `close_write`. --- lib/openssl/ssl.rb | 11 +++++++++++ test/openssl/test_ssl.rb | 24 ++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/lib/openssl/ssl.rb b/lib/openssl/ssl.rb index 75a74a3f5..0568276a1 100644 --- a/lib/openssl/ssl.rb +++ b/lib/openssl/ssl.rb @@ -459,6 +459,17 @@ def session nil end + # Close the stream for reading. + def close_read + # Unsupported and ignored. + # Just don't read any more. + end + + # Close the stream for writing. + def close_write + stop + end + private def using_anon_cipher? diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb index 66d63a981..3df391fac 100644 --- a/test/openssl/test_ssl.rb +++ b/test/openssl/test_ssl.rb @@ -117,6 +117,30 @@ def test_socket_open_with_local_address_port_context } end + def test_socket_close_write + server_proc = proc do |ctx, ssl| + message = ssl.read + ssl.write(message) + ssl.close_write + ensure + ssl.close + end + + start_server(server_proc: server_proc) do |port| + ctx = OpenSSL::SSL::SSLContext.new + ssl = OpenSSL::SSL::SSLSocket.open("127.0.0.1", port, context: ctx) + ssl.sync_close = true + ssl.connect + + message = "abc"*1024 + ssl.write message + ssl.close_write + assert_equal message, ssl.read + ensure + ssl&.close + end + end + def test_add_certificate ctx_proc = -> ctx { # Unset values set by start_server