diff options
author | palkan <dementiev.vm@gmail.com> | 2017-07-06 17:34:05 +0300 |
---|---|---|
committer | palkan <dementiev.vm@gmail.com> | 2017-07-06 17:34:05 +0300 |
commit | 2bce7777b70efe81f45e4ae8dc61b25f1e18771e (patch) | |
tree | 31ebb4f359bd8b604621d510b9c6944be4eecc96 /actioncable/lib/action_cable | |
parent | c8ce3459648ce0f86646b564ce1c0bb16a4b48eb (diff) | |
download | rails-2bce7777b70efe81f45e4ae8dc61b25f1e18771e.tar.gz rails-2bce7777b70efe81f45e4ae8dc61b25f1e18771e.tar.bz2 rails-2bce7777b70efe81f45e4ae8dc61b25f1e18771e.zip |
[Fix #28751] Hash stream long stream identifiers when using Postgres adapter
Diffstat (limited to 'actioncable/lib/action_cable')
-rw-r--r-- | actioncable/lib/action_cable/subscription_adapter/postgresql.rb | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/actioncable/lib/action_cable/subscription_adapter/postgresql.rb b/actioncable/lib/action_cable/subscription_adapter/postgresql.rb index bdab5205ec..487564c46c 100644 --- a/actioncable/lib/action_cable/subscription_adapter/postgresql.rb +++ b/actioncable/lib/action_cable/subscription_adapter/postgresql.rb @@ -1,6 +1,7 @@ gem "pg", "~> 0.18" require "pg" require "thread" +require "digest/sha1" module ActionCable module SubscriptionAdapter @@ -12,16 +13,16 @@ module ActionCable def broadcast(channel, payload) with_connection do |pg_conn| - pg_conn.exec("NOTIFY #{pg_conn.escape_identifier(channel)}, '#{pg_conn.escape_string(payload)}'") + pg_conn.exec("NOTIFY #{pg_conn.escape_identifier(channel_identifier(channel))}, '#{pg_conn.escape_string(payload)}'") end end def subscribe(channel, callback, success_callback = nil) - listener.add_subscriber(channel, callback, success_callback) + listener.add_subscriber(channel_identifier(channel), callback, success_callback) end def unsubscribe(channel, callback) - listener.remove_subscriber(channel, callback) + listener.remove_subscriber(channel_identifier(channel), callback) end def shutdown @@ -41,6 +42,10 @@ module ActionCable end private + def channel_identifier(channel) + channel.size > 63 ? Digest::SHA1.hexdigest(channel) : channel + end + def listener @listener || @server.mutex.synchronize { @listener ||= Listener.new(self, @server.event_loop) } end |