diff options
author | Miklós Fazekas <mfazekas@szemafor.com> | 2016-08-14 15:16:26 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-08-14 15:16:26 +0200 |
commit | 1455fa2ec977137b5ca95320d46e8759c60c0035 (patch) | |
tree | 6b64d1564896c44357144cf0062cc993262525a6 | |
parent | 87bcc22315c20e48dc0c0401e95a8681715efaf5 (diff) | |
parent | eb05049b18692055fab22a0478c9a02cc034860c (diff) | |
download | net-ssh-ignore-disconnect-exception-when-all-closed.tar.gz |
Merge pull request #421 from mfazekas/read-data-return-before-raiseignore-disconnect-exception-when-all-closed
non blocking next_packet shall return the available data before raisi…
-rw-r--r-- | lib/net/ssh/transport/packet_stream.rb | 7 | ||||
-rw-r--r-- | test/transport/test_packet_stream.rb | 18 |
2 files changed, 23 insertions, 2 deletions
diff --git a/lib/net/ssh/transport/packet_stream.rb b/lib/net/ssh/transport/packet_stream.rb index 8e9ffe5..f38b5d7 100644 --- a/lib/net/ssh/transport/packet_stream.rb +++ b/lib/net/ssh/transport/packet_stream.rb @@ -86,7 +86,12 @@ module Net; module SSH; module Transport when :nonblock then if available_for_read? if fill <= 0 - raise Net::SSH::Disconnect, "connection closed by remote host" + result = poll_next_packet + if result.nil? + raise Net::SSH::Disconnect, "connection closed by remote host" + else + return result + end end end poll_next_packet diff --git a/test/transport/test_packet_stream.rb b/test/transport/test_packet_stream.rb index f3e67f6..3e01f55 100644 --- a/test/transport/test_packet_stream.rb +++ b/test/transport/test_packet_stream.rb @@ -6,7 +6,7 @@ require 'net/ssh/transport/packet_stream' module Transport - class TestPacketStream < NetSSHTest + class TestPacketStream < NetSSHTest # rubocop:disable Metrics/ClassLength include Net::SSH::Transport::Constants def test_client_name_when_getnameinfo_works @@ -142,6 +142,22 @@ module Transport assert_equal DEBUG, packet.type end + def test_nonblocking_next_packet_should_raise + IO.stubs(:select).returns([[stream]]) + stream.stubs(:recv).returns("") + assert_raises(Net::SSH::Disconnect) { stream.next_packet(:nonblock) } + end + + def test_nonblocking_next_packet_should_return_packet_before_raise + IO.stubs(:select).returns([[stream]]) + stream.send(:input).append(packet) + stream.stubs(:recv).returns("") + packet = stream.next_packet(:nonblock) + assert_not_nil packet + assert_equal DEBUG, packet.type + assert_raises(Net::SSH::Disconnect) { stream.next_packet(:nonblock) } + end + def test_next_packet_should_block_when_requested_until_entire_packet_is_available IO.stubs(:select).returns([[stream]]) stream.stubs(:recv).returns(packet[0,10], packet[10,20], packet[20..-1]) |