diff options
author | Matthew Draper <matthew@trebex.net> | 2016-02-19 11:17:51 +1030 |
---|---|---|
committer | Matthew Draper <matthew@trebex.net> | 2016-02-19 11:17:51 +1030 |
commit | 6da571add8e8fee0e6252f93978d63fb57f29417 (patch) | |
tree | c109080f914cd716a90985d60006837cbd35bb70 /actioncable | |
parent | 042bfb8715ca301dc37e5e883951f6aa07fbc7ea (diff) | |
parent | cefcc0f66e185b808fc93040b1d7805f95bf929f (diff) | |
download | rails-6da571add8e8fee0e6252f93978d63fb57f29417.tar.gz rails-6da571add8e8fee0e6252f93978d63fb57f29417.tar.bz2 rails-6da571add8e8fee0e6252f93978d63fb57f29417.zip |
Merge pull request #23715 from maclover7/fix-unsubscribe
Fix `unsubscribed` server side behavior
Diffstat (limited to 'actioncable')
-rw-r--r-- | actioncable/lib/action_cable/connection/client_socket.rb | 7 | ||||
-rw-r--r-- | actioncable/lib/action_cable/connection/subscriptions.rb | 2 | ||||
-rw-r--r-- | actioncable/test/client/echo_channel.rb | 4 | ||||
-rw-r--r-- | actioncable/test/client_test.rb | 21 |
4 files changed, 28 insertions, 6 deletions
diff --git a/actioncable/lib/action_cable/connection/client_socket.rb b/actioncable/lib/action_cable/connection/client_socket.rb index ef937d7c16..95e1ac4c16 100644 --- a/actioncable/lib/action_cable/connection/client_socket.rb +++ b/actioncable/lib/action_cable/connection/client_socket.rb @@ -132,11 +132,8 @@ module ActionCable @ready_state = CLOSING @close_params = [reason, code] - if @stream - @stream.shutdown - else - finalize_close - end + @stream.shutdown if @stream + finalize_close end def finalize_close diff --git a/actioncable/lib/action_cable/connection/subscriptions.rb b/actioncable/lib/action_cable/connection/subscriptions.rb index d7f95e6a62..24934e12f2 100644 --- a/actioncable/lib/action_cable/connection/subscriptions.rb +++ b/actioncable/lib/action_cable/connection/subscriptions.rb @@ -54,7 +54,7 @@ module ActionCable end def unsubscribe_from_all - subscriptions.each { |id, channel| channel.unsubscribe_from_channel } + subscriptions.each { |id, channel| remove_subscription(channel) } end protected diff --git a/actioncable/test/client/echo_channel.rb b/actioncable/test/client/echo_channel.rb index 63e35f194a..5a7bac25c5 100644 --- a/actioncable/test/client/echo_channel.rb +++ b/actioncable/test/client/echo_channel.rb @@ -3,6 +3,10 @@ class EchoChannel < ActionCable::Channel::Base stream_from "global" end + def unsubscribed + 'Goodbye from EchoChannel!' + end + def ding(data) transmit(dong: data['message']) end diff --git a/actioncable/test/client_test.rb b/actioncable/test/client_test.rb index 26629216e5..1b07689127 100644 --- a/actioncable/test/client_test.rb +++ b/actioncable/test/client_test.rb @@ -199,4 +199,25 @@ class ClientTest < ActionCable::TestCase c.close # disappear before read end end + + def test_unsubscribe_client + with_puma_server do |port| + app = ActionCable.server + identifier = JSON.dump(channel: 'EchoChannel') + + c = faye_client(port) + c.send_message command: 'subscribe', identifier: identifier + assert_equal({"identifier"=>"{\"channel\":\"EchoChannel\"}", "type"=>"confirm_subscription"}, c.read_message) + assert_equal(1, app.connections.count) + assert(app.remote_connections.where(identifier: identifier)) + + channel = app.connections.first.subscriptions.send(:subscriptions).first[1] + channel.expects(:unsubscribed) + c.close + sleep 0.1 # Data takes a moment to process + + # All data is removed: No more connection or subscription information! + assert_equal(0, app.connections.count) + end + end end |