diff options
author | Jamis Buck <jamis@37signals.com> | 2007-08-18 14:32:51 +0000 |
---|---|---|
committer | Jamis Buck <jamis@37signals.com> | 2007-08-18 14:32:51 +0000 |
commit | f8f0023addadaf05319e7a1cbae497020f022d38 (patch) | |
tree | 75ce7e46ae99a92faddeefb025220e0bfdb0aab2 | |
parent | 51ab0d7998c0d6a785dc59918e9cc215577b2229 (diff) | |
download | net-ssh-f8f0023addadaf05319e7a1cbae497020f022d38.tar.gz |
make sure CHANNEL_OPEN_FAILURE is handled
git-svn-id: http://svn.jamisbuck.org/net-ssh/branches/v2@194 1d2a57f2-1ded-0310-ad52-83097a15a5de
-rw-r--r-- | lib/net/ssh/connection/session.rb | 6 | ||||
-rw-r--r-- | lib/net/ssh/packet.rb | 39 | ||||
-rw-r--r-- | test/connection/test_session.rb | 7 |
3 files changed, 33 insertions, 19 deletions
diff --git a/lib/net/ssh/connection/session.rb b/lib/net/ssh/connection/session.rb index 644d727..16e9338 100644 --- a/lib/net/ssh/connection/session.rb +++ b/lib/net/ssh/connection/session.rb @@ -308,6 +308,12 @@ module Net; module SSH; module Connection channel.do_open_confirmation(packet[:remote_id], packet[:window_size], packet[:packet_size]) end + def channel_open_failure(packet) + error { "channel_open_failed: #{packet[:local_id]} #{packet[:reason_code]} #{packet[:description]}" } + channels.delete(packet[:local_id]) + raise ChannelOpenFailed.new(packet[:reason_code], packet[:description]) + end + def channel_window_adjust(packet) trace { "channel_window_adjust: #{packet[:local_id]} +#{packet[:extra_bytes]}" } channels[packet[:local_id]].do_window_adjust(packet[:extra_bytes]) diff --git a/lib/net/ssh/packet.rb b/lib/net/ssh/packet.rb index 3177681..cd62d1c 100644 --- a/lib/net/ssh/packet.rb +++ b/lib/net/ssh/packet.rb @@ -20,26 +20,27 @@ module Net; module SSH @@types[type] = pairs end - register Transport::Constants::DISCONNECT, [:reason_code, :long], [:description, :string], [:language, :string] - register Transport::Constants::IGNORE, [:data, :string] - register Transport::Constants::UNIMPLEMENTED, [:number, :long] - register Transport::Constants::DEBUG, [:always_display, :bool], [:message, :string], [:language, :string] - register Transport::Constants::SERVICE_ACCEPT, [:service_name, :string] + include Transport::Constants, Authentication::Constants, Connection::Constants - register Authentication::Constants::USERAUTH_BANNER, [:message, :string], [:language, :string] - register Authentication::Constants::USERAUTH_FAILURE, [:authentications, :string], [:partial_success, :bool] - - register Connection::Constants::GLOBAL_REQUEST, [:request_type, :string], [:want_reply, :bool], [:request_data, :buffer] - register Connection::Constants::CHANNEL_OPEN, [:channel_type, :string], [:remote_id, :long], [:window_size, :long], [:packet_size, :long] - register Connection::Constants::CHANNEL_OPEN_CONFIRMATION, [:local_id, :long], [:remote_id, :long], [:window_size, :long], [:packet_size, :long] - register Connection::Constants::CHANNEL_WINDOW_ADJUST, [:local_id, :long], [:extra_bytes, :long] - register Connection::Constants::CHANNEL_DATA, [:local_id, :long], [:data, :string] - register Connection::Constants::CHANNEL_EXTENDED_DATA, [:local_id, :long], [:data_type, :long], [:data, :string] - register Connection::Constants::CHANNEL_EOF, [:local_id, :long] - register Connection::Constants::CHANNEL_CLOSE, [:local_id, :long] - register Connection::Constants::CHANNEL_REQUEST, [:local_id, :long], [:request, :string], [:want_reply, :bool], [:request_data, :buffer] - register Connection::Constants::CHANNEL_SUCCESS, [:local_id, :long] - register Connection::Constants::CHANNEL_FAILURE, [:local_id, :long] + register DISCONNECT, [:reason_code, :long], [:description, :string], [:language, :string] + register IGNORE, [:data, :string] + register UNIMPLEMENTED, [:number, :long] + register DEBUG, [:always_display, :bool], [:message, :string], [:language, :string] + register SERVICE_ACCEPT, [:service_name, :string] + register USERAUTH_BANNER, [:message, :string], [:language, :string] + register USERAUTH_FAILURE, [:authentications, :string], [:partial_success, :bool] + register GLOBAL_REQUEST, [:request_type, :string], [:want_reply, :bool], [:request_data, :buffer] + register CHANNEL_OPEN, [:channel_type, :string], [:remote_id, :long], [:window_size, :long], [:packet_size, :long] + register CHANNEL_OPEN_CONFIRMATION, [:local_id, :long], [:remote_id, :long], [:window_size, :long], [:packet_size, :long] + register CHANNEL_OPEN_FAILURE, [:local_id, :long], [:reason_code, :long], [:description, :string], [:language, :string] + register CHANNEL_WINDOW_ADJUST, [:local_id, :long], [:extra_bytes, :long] + register CHANNEL_DATA, [:local_id, :long], [:data, :string] + register CHANNEL_EXTENDED_DATA, [:local_id, :long], [:data_type, :long], [:data, :string] + register CHANNEL_EOF, [:local_id, :long] + register CHANNEL_CLOSE, [:local_id, :long] + register CHANNEL_REQUEST, [:local_id, :long], [:request, :string], [:want_reply, :bool], [:request_data, :buffer] + register CHANNEL_SUCCESS, [:local_id, :long] + register CHANNEL_FAILURE, [:local_id, :long] # The (integer) type of this packet. attr_reader :type diff --git a/test/connection/test_session.rb b/test/connection/test_session.rb index b6921a0..debf920 100644 --- a/test/connection/test_session.rb +++ b/test/connection/test_session.rb @@ -255,6 +255,13 @@ module Connection assert_equal "auth-agent", ch.type end + def test_channel_open_failure_should_remove_channel_raise_exception + session.channels[1] = stub("channel") + transport.return(CHANNEL_OPEN_FAILURE, :long, 1, :long, 1234, :string, "some reason", :string, "lang tag") + assert_raises(Net::SSH::ChannelOpenFailed) { process_times(2) } + assert session.channels.empty? + end + def test_channel_open_confirmation_packet_should_be_routed_to_corresponding_channel channel_at(14).expects(:do_open_confirmation).with(1234, 0x20001, 0x10001) transport.return(CHANNEL_OPEN_CONFIRMATION, :long, 14, :long, 1234, :long, 0x20001, :long, 0x10001) |