aboutsummaryrefslogtreecommitdiffstats
path: root/actioncable/lib/action_cable
diff options
context:
space:
mode:
authorpalkan <dementiev.vm@gmail.com>2017-07-06 17:34:05 +0300
committerpalkan <dementiev.vm@gmail.com>2017-07-06 17:34:05 +0300
commit2bce7777b70efe81f45e4ae8dc61b25f1e18771e (patch)
tree31ebb4f359bd8b604621d510b9c6944be4eecc96 /actioncable/lib/action_cable
parentc8ce3459648ce0f86646b564ce1c0bb16a4b48eb (diff)
downloadrails-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.rb11
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