amqp 0.8.0.rc11 → 0.8.0.rc12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +1 -0
- data/Gemfile +2 -1
- data/amqp.gemspec +1 -1
- data/docs/ConnectingToTheBroker.textile +136 -6
- data/docs/GettingStarted.textile +2 -2
- data/docs/Queues.textile +14 -14
- data/examples/channels/open_channel_with_one_arity_callback.rb +30 -0
- data/examples/deprecated/default_thread_local_channel_instance.rb +34 -0
- data/examples/error_handling/channel_level_exception.rb +1 -1
- data/examples/error_handling/channel_level_exception_with_multiple_channels_involved.rb +1 -1
- data/examples/error_handling/global_channel_level_exception_handler.rb +1 -1
- data/examples/guides/getting_started/03_babblr.rb +1 -1
- data/examples/guides/queues/05_binding_a_queue_using_exchange_instance.rb +1 -1
- data/examples/guides/queues/06_biding_a_queue_using_exchange_name_string.rb +1 -1
- data/examples/guides/queues/07_subscribing_to_receive_messages.rb +1 -1
- data/examples/guides/queues/08_poll_for_messages.rb +1 -1
- data/examples/guides/queues/09_unsubscribing_a_consumer.rb +1 -1
- data/examples/guides/queues/10_unbinding_from_exchange.rb +1 -1
- data/examples/guides/queues/11_purge_a_queue.rb +1 -1
- data/examples/guides/queues/12_deleting_a_queue.rb +1 -1
- data/examples/queues/declare_a_queue_without_assignment.rb +1 -1
- data/examples/queues/declare_and_bind_a_server_named_queue.rb +1 -1
- data/lib/amqp/channel.rb +27 -1
- data/lib/amqp/client.rb +36 -8
- data/lib/amqp/connection.rb +6 -3
- data/lib/amqp/deprecated/mq.rb +0 -22
- data/lib/amqp/queue.rb +19 -13
- data/lib/amqp/version.rb +1 -1
- data/spec/integration/authentication_spec.rb +7 -5
- data/spec/spec_helper.rb +1 -0
- data/spec/unit/amqp/client_spec.rb +149 -0
- data/spec/unit/amqp/connection_spec.rb +20 -0
- metadata +108 -86
@@ -5,7 +5,7 @@ require "rubygems"
|
|
5
5
|
require "amqp"
|
6
6
|
|
7
7
|
# Binding a queue to an exchange
|
8
|
-
AMQP.start("amqp://guest:guest@dev.rabbitmq.com:5672
|
8
|
+
AMQP.start("amqp://guest:guest@dev.rabbitmq.com:5672") do |connection, open_ok|
|
9
9
|
AMQP::Channel.new do |channel, open_ok|
|
10
10
|
exchange = channel.fanout("amq.fanout")
|
11
11
|
|
@@ -5,7 +5,7 @@ require "rubygems"
|
|
5
5
|
require "amqp"
|
6
6
|
|
7
7
|
# Binding a queue to an exchange
|
8
|
-
AMQP.start("amqp://guest:guest@dev.rabbitmq.com:5672
|
8
|
+
AMQP.start("amqp://guest:guest@dev.rabbitmq.com:5672") do |connection, open_ok|
|
9
9
|
AMQP::Channel.new do |channel, open_ok|
|
10
10
|
exchange_name = "amq.fanout"
|
11
11
|
|
@@ -4,7 +4,7 @@
|
|
4
4
|
require "rubygems"
|
5
5
|
require "amqp"
|
6
6
|
|
7
|
-
AMQP.start("amqp://guest:guest@dev.rabbitmq.com:5672
|
7
|
+
AMQP.start("amqp://guest:guest@dev.rabbitmq.com:5672") do |connection, open_ok|
|
8
8
|
AMQP::Channel.new do |channel, open_ok|
|
9
9
|
exchange = channel.fanout("amq.fanout")
|
10
10
|
|
@@ -4,7 +4,7 @@
|
|
4
4
|
require "rubygems"
|
5
5
|
require "amqp"
|
6
6
|
|
7
|
-
AMQP.start("amqp://guest:guest@dev.rabbitmq.com:5672
|
7
|
+
AMQP.start("amqp://guest:guest@dev.rabbitmq.com:5672") do |connection, open_ok|
|
8
8
|
AMQP::Channel.new do |channel, open_ok|
|
9
9
|
exchange = channel.fanout("amq.fanout")
|
10
10
|
|
@@ -4,7 +4,7 @@
|
|
4
4
|
require "rubygems"
|
5
5
|
require "amqp"
|
6
6
|
|
7
|
-
AMQP.start("amqp://guest:guest@dev.rabbitmq.com:5672
|
7
|
+
AMQP.start("amqp://guest:guest@dev.rabbitmq.com:5672") do |connection, open_ok|
|
8
8
|
AMQP::Channel.new do |channel, open_ok|
|
9
9
|
exchange = channel.fanout("amq.fanout")
|
10
10
|
|
@@ -4,7 +4,7 @@
|
|
4
4
|
require "rubygems"
|
5
5
|
require "amqp"
|
6
6
|
|
7
|
-
AMQP.start("amqp://guest:guest@dev.rabbitmq.com:5672
|
7
|
+
AMQP.start("amqp://guest:guest@dev.rabbitmq.com:5672") do |connection, open_ok|
|
8
8
|
puts "Connected"
|
9
9
|
AMQP::Channel.new(connection) do |channel, open_ok|
|
10
10
|
puts "Opened a channel"
|
@@ -4,7 +4,7 @@
|
|
4
4
|
require "rubygems"
|
5
5
|
require "amqp"
|
6
6
|
|
7
|
-
AMQP.start("amqp://guest:guest@dev.rabbitmq.com:5672
|
7
|
+
AMQP.start("amqp://guest:guest@dev.rabbitmq.com:5672") do |connection, open_ok|
|
8
8
|
puts "Connected"
|
9
9
|
AMQP::Channel.new(connection) do |channel, open_ok|
|
10
10
|
puts "Opened a channel"
|
@@ -4,7 +4,7 @@
|
|
4
4
|
require "rubygems"
|
5
5
|
require "amqp"
|
6
6
|
|
7
|
-
AMQP.start("amqp://guest:guest@dev.rabbitmq.com:5672
|
7
|
+
AMQP.start("amqp://guest:guest@dev.rabbitmq.com:5672") do |connection, open_ok|
|
8
8
|
puts "Connected"
|
9
9
|
AMQP::Channel.new(connection) do |channel, open_ok|
|
10
10
|
puts "Opened a channel"
|
@@ -11,7 +11,7 @@ require 'amqp'
|
|
11
11
|
|
12
12
|
puts "=> Queue#initialize example that uses a block"
|
13
13
|
puts
|
14
|
-
AMQP.start("amqp://guest:guest@dev.rabbitmq.com:5672
|
14
|
+
AMQP.start("amqp://guest:guest@dev.rabbitmq.com:5672") do |connection, open_ok|
|
15
15
|
AMQP::Channel.new do |channel, open_ok|
|
16
16
|
puts "Channel ##{channel.id} is now open!"
|
17
17
|
|
@@ -11,7 +11,7 @@ require 'amqp'
|
|
11
11
|
|
12
12
|
puts "=> Queue#initialize example that uses a block"
|
13
13
|
puts
|
14
|
-
AMQP.start("amqp://guest:guest@dev.rabbitmq.com:5672
|
14
|
+
AMQP.start("amqp://guest:guest@dev.rabbitmq.com:5672") do |connection, open_ok|
|
15
15
|
AMQP::Channel.new do |channel, open_ok|
|
16
16
|
puts "Channel ##{channel.id} is now open!" if channel.open?
|
17
17
|
|
data/lib/amqp/channel.rb
CHANGED
@@ -80,7 +80,7 @@ module AMQP
|
|
80
80
|
# It is possible (and, indeed, recommended) to handle channel-level exceptions by defining an errback using #on_error:
|
81
81
|
#
|
82
82
|
# @example Queue declaration with incompatible attributes results in a channel-level exception
|
83
|
-
# AMQP.start("amqp://guest:guest@dev.rabbitmq.com:5672
|
83
|
+
# AMQP.start("amqp://guest:guest@dev.rabbitmq.com:5672") do |connection, open_ok|
|
84
84
|
# AMQP::Channel.new do |channel, open_ok|
|
85
85
|
# puts "Channel ##{channel.id} is now open!"
|
86
86
|
#
|
@@ -926,6 +926,32 @@ module AMQP
|
|
926
926
|
end
|
927
927
|
|
928
928
|
|
929
|
+
#
|
930
|
+
# Backwards compatibility with 0.6.x
|
931
|
+
#
|
932
|
+
|
933
|
+
# unique identifier
|
934
|
+
# @deprecated
|
935
|
+
def self.id
|
936
|
+
Thread.current[:mq_id] ||= "#{`hostname`.strip}-#{Process.pid}-#{Thread.current.object_id}"
|
937
|
+
end
|
938
|
+
|
939
|
+
# @private
|
940
|
+
# @deprecated
|
941
|
+
def self.default
|
942
|
+
# TODO: clear this when connection is closed
|
943
|
+
Thread.current[:mq] ||= AMQP::Channel.new
|
944
|
+
end
|
945
|
+
|
946
|
+
# Allows for calls to all MQ instance methods. This implicitly calls
|
947
|
+
# AMQP::Channel.new so that a new channel is allocated for subsequent operations.
|
948
|
+
# @deprecated
|
949
|
+
def self.method_missing(meth, *args, &blk)
|
950
|
+
self.default.__send__(meth, *args, &blk)
|
951
|
+
end
|
952
|
+
|
953
|
+
|
954
|
+
|
929
955
|
protected
|
930
956
|
|
931
957
|
# @private
|
data/lib/amqp/client.rb
CHANGED
@@ -21,6 +21,8 @@ module AMQP
|
|
21
21
|
# @see AMQP.start
|
22
22
|
# @see AMQP.connect
|
23
23
|
# @api plugin
|
24
|
+
#
|
25
|
+
# @see http://bit.ly/ks8MXK Connecting to The Broker documentation guide
|
24
26
|
def self.connect(connection_string_or_options = {}, options = {}, &block)
|
25
27
|
opts = case connection_string_or_options
|
26
28
|
when String then
|
@@ -40,21 +42,47 @@ module AMQP
|
|
40
42
|
|
41
43
|
# Parses AMQP connection string and returns it's components as a hash.
|
42
44
|
#
|
43
|
-
#
|
45
|
+
# h2. vhost naming schemes
|
46
|
+
#
|
47
|
+
# AMQP 0.9.1 spec does not define what vhost naming scheme should be. RabbitMQ and Apache Qpid use different schemes
|
48
|
+
# (Qpid said to have two) but the bottom line is: even though some brokers use / as the default vhost, it can be *any string*.
|
49
|
+
# Host (and optional port) part must be separated from vhost (path component) with a slash character (/).
|
50
|
+
#
|
51
|
+
# This method will also unescape path part of the URI.
|
52
|
+
#
|
53
|
+
# @example How vhost is parsed
|
54
|
+
#
|
55
|
+
# AMQP::Client.parse_connection_uri("amqp://dev.rabbitmq.com") # => vhost is nil, so default (/) will be used
|
56
|
+
# AMQP::Client.parse_connection_uri("amqp://dev.rabbitmq.com/") # => vhost is an empty string
|
57
|
+
# AMQP::Client.parse_connection_uri("amqp://dev.rabbitmq.com//") # => vhost is /
|
58
|
+
# AMQP::Client.parse_connection_uri("amqp://dev.rabbitmq.com//vault") # => vhost is /vault
|
59
|
+
# AMQP::Client.parse_connection_uri("amqp://dev.rabbitmq.com/%2Fvault") # => vhost is /vault
|
60
|
+
# AMQP::Client.parse_connection_uri("amqp://dev.rabbitmq.com/production") # => vhost is production
|
61
|
+
# AMQP::Client.parse_connection_uri("amqp://dev.rabbitmq.com/a.b.c") # => vhost is a.b.c
|
62
|
+
# AMQP::Client.parse_connection_uri("amqp://dev.rabbitmq.com///a/b/c/d") # => vhost is //a/b/c/d
|
63
|
+
#
|
64
|
+
#
|
65
|
+
# @param [String] connection_string AMQP connection URI, à la JDBC connection string. For example: amqp://bus.megacorp.internal:5877.
|
44
66
|
# @return [Hash] Connection parameters (:username, :password, :vhost, :host, :port, :ssl)
|
67
|
+
#
|
68
|
+
# @raise [ArgumentError] When connection URI schema is not amqp or amqps.
|
69
|
+
#
|
70
|
+
# @see http://bit.ly/ks8MXK Connecting to The Broker documentation guide
|
45
71
|
# @api public
|
46
72
|
def self.parse_connection_uri(connection_string)
|
47
73
|
uri = URI.parse(connection_string)
|
48
|
-
raise("Connection URI must use amqp or amqps schema (example: amqp://bus.megacorp.internal:5766/
|
74
|
+
raise ArgumentError.new("Connection URI must use amqp or amqps schema (example: amqp://bus.megacorp.internal:5766), learn more at http://bit.ly/ks8MXK") unless %w{amqp amqps}.include?(uri.scheme)
|
49
75
|
|
50
76
|
opts = {}
|
51
77
|
|
52
|
-
|
53
|
-
opts[:
|
54
|
-
opts[:
|
55
|
-
opts[:
|
56
|
-
opts[:
|
57
|
-
opts[:
|
78
|
+
|
79
|
+
opts[:scheme] = uri.scheme
|
80
|
+
opts[:user] = URI.unescape(uri.user) if uri.user
|
81
|
+
opts[:pass] = URI.unescape(uri.password) if uri.password
|
82
|
+
opts[:vhost] = URI.unescape($1) if uri.path =~ %r{^/(.*)}
|
83
|
+
opts[:host] = uri.host if uri.host
|
84
|
+
opts[:port] = uri.port || AMQP_PORTS[uri.scheme]
|
85
|
+
opts[:ssl] = uri.scheme == AMQPS
|
58
86
|
|
59
87
|
opts
|
60
88
|
end
|
data/lib/amqp/connection.rb
CHANGED
@@ -15,7 +15,7 @@ module AMQP
|
|
15
15
|
# to AMQP broker using {AMQP.connect}. It is generally a good idea to
|
16
16
|
# start EventMachine event loop in a separate thread and use {AMQP.connect}.
|
17
17
|
# That said, for applications that do not publish or handle large volumes of
|
18
|
-
# data {AMQP.start} works very well and
|
18
|
+
# data {AMQP.start} works very well and its use is not discouraged.
|
19
19
|
#
|
20
20
|
# See {AMQP.connect} for information about arguments this method takes and
|
21
21
|
# information about relevant topics such as authentication failure handling.
|
@@ -37,7 +37,9 @@ module AMQP
|
|
37
37
|
# @api public
|
38
38
|
def self.start(connection_options_or_string = {}, other_options = {}, &block)
|
39
39
|
EM.run do
|
40
|
-
|
40
|
+
if !@connection || @connection.closed? || @connection.closing?
|
41
|
+
@connection = connect(connection_options_or_string, other_options, &block)
|
42
|
+
end
|
41
43
|
@channel = Channel.new(@connection)
|
42
44
|
@connection
|
43
45
|
end
|
@@ -169,7 +171,7 @@ module AMQP
|
|
169
171
|
#
|
170
172
|
# @example Using AMQP.connect to connect to a public RabbitMQ instance with connection settings given as a URI
|
171
173
|
#
|
172
|
-
# AMQP.connect "amqp://guest:guest@dev.rabbitmq.com:5672
|
174
|
+
# AMQP.connect "amqp://guest:guest@dev.rabbitmq.com:5672", :on_possible_authentication_failure => Proc.new { puts("Looks like authentication has failed") } do |connection|
|
173
175
|
# AMQP::Channel.new(connection) do |channel|
|
174
176
|
# # ...
|
175
177
|
# end
|
@@ -191,6 +193,7 @@ module AMQP
|
|
191
193
|
# @option connection_options_or_string [String] :username ("guest") Username to use. Also can be specified as :user.
|
192
194
|
# @option connection_options_or_string [String] :password ("guest") Password to use. Also can be specified as :pass.
|
193
195
|
# @option connection_options_or_string [Hash] :ssl TLS (SSL) parameters to use.
|
196
|
+
# @option connection_options_or_string [#call] :on_tcp_connection_failure A callable object that will be run if connection to server fails
|
194
197
|
# @option connection_options_or_string [#call] :on_possible_authentication_failure A callable object that will be run if authentication fails (see Authentication failure section)
|
195
198
|
#
|
196
199
|
#
|
data/lib/amqp/deprecated/mq.rb
CHANGED
@@ -17,26 +17,4 @@ class MQ
|
|
17
17
|
# @note This class will be removed before 1.0 release.
|
18
18
|
# @deprecated
|
19
19
|
class Queue < ::AMQP::Queue; end
|
20
|
-
|
21
|
-
|
22
|
-
#
|
23
|
-
# Backwards compatibility with 0.6.x
|
24
|
-
#
|
25
|
-
|
26
|
-
# unique identifier
|
27
|
-
def MQ.id
|
28
|
-
Thread.current[:mq_id] ||= "#{`hostname`.strip}-#{Process.pid}-#{Thread.current.object_id}"
|
29
|
-
end
|
30
|
-
|
31
|
-
# @private
|
32
|
-
def MQ.default
|
33
|
-
# TODO: clear this when connection is closed
|
34
|
-
Thread.current[:mq] ||= MQ.new
|
35
|
-
end
|
36
|
-
|
37
|
-
# Allows for calls to all MQ instance methods. This implicitly calls
|
38
|
-
# MQ.new so that a new channel is allocated for subsequent operations.
|
39
|
-
def MQ.method_missing(meth, *args, &blk)
|
40
|
-
MQ.default.__send__(meth, *args, &blk)
|
41
|
-
end
|
42
20
|
end
|
data/lib/amqp/queue.rb
CHANGED
@@ -219,27 +219,33 @@ module AMQP
|
|
219
219
|
end # server_named?
|
220
220
|
|
221
221
|
|
222
|
-
# This method binds a queue to an exchange.
|
223
|
-
# bound it will not receive any messages.
|
222
|
+
# This method binds a queue to an exchange. Until a queue is
|
223
|
+
# bound it will not receive any messages. In a classic messaging
|
224
224
|
# model, store-and-forward queues are bound to a dest exchange
|
225
225
|
# and subscription queues are bound to a dest_wild exchange.
|
226
226
|
#
|
227
227
|
# A valid exchange name (or reference) must be passed as the first
|
228
228
|
# parameter.
|
229
|
-
# @example
|
230
|
-
# exch = AMQP::Channel.direct('foo exchange')
|
231
|
-
# queue = AMQP::Channel.queue('bar queue')
|
232
|
-
# queue.bind('foo.exchange') # OR
|
233
|
-
# queue.bind(exch)
|
229
|
+
# @example Binding a queue to exchange using AMQP::Exchange instance
|
234
230
|
#
|
235
|
-
#
|
231
|
+
# ch = AMQP::Channel.new(connection)
|
232
|
+
# exchange = ch.direct('backlog.events')
|
233
|
+
# queue = ch.queue('', :exclusive => true)
|
234
|
+
# queue.bind(exchange)
|
236
235
|
#
|
237
|
-
# It is unnecessary to call #bind when the exchange name and queue
|
238
|
-
# name match exactly (for :direct and :fanout exchanges only).
|
239
|
-
# There is an implicit bind which will deliver the messages from
|
240
|
-
# the exchange to the queue.
|
241
236
|
#
|
242
|
-
# @
|
237
|
+
# @example Binding a queue to exchange using exchange name
|
238
|
+
#
|
239
|
+
# ch = AMQP::Channel.new(connection)
|
240
|
+
# queue = ch.queue('', :exclusive => true)
|
241
|
+
# queue.bind('backlog.events')
|
242
|
+
#
|
243
|
+
#
|
244
|
+
# Note that if your producer application knows consumer queue name and wants to deliver
|
245
|
+
# a message there, direct exchange may be sufficient (in other words, if your code declares an exchange with
|
246
|
+
# the same name as a queue and binds it to that queue, consider using the default exchange and routing key on publishing).
|
247
|
+
#
|
248
|
+
# @param [Exchange] Exchange to bind to. May also be a string or any object that responds to #name.
|
243
249
|
#
|
244
250
|
# @option opts [String] :routing_key Specifies the routing key for the binding. The routing key is
|
245
251
|
# used for routing messages depending on the exchange configuration.
|
data/lib/amqp/version.rb
CHANGED
@@ -10,6 +10,8 @@ describe "Authentication attempt" do
|
|
10
10
|
include EventedSpec::EMSpec
|
11
11
|
include EventedSpec::SpecHelper
|
12
12
|
|
13
|
+
default_timeout 1.0
|
14
|
+
|
13
15
|
|
14
16
|
describe "with default connection parameters" do
|
15
17
|
|
@@ -45,12 +47,12 @@ describe "Authentication attempt" do
|
|
45
47
|
|
46
48
|
# assuming there is an account amqp_gem with password of "amqp_gem_password" that has
|
47
49
|
# access to /amqp_gem_testbed
|
48
|
-
context "when amqp_gem/amqp_gem_testbed has access to
|
50
|
+
context "when amqp_gem/amqp_gem_testbed has access to amqp_gem_testbed" do
|
49
51
|
context "and provided credentials are correct" do
|
50
52
|
it "succeeds" do
|
51
|
-
connection = AMQP.connect
|
53
|
+
connection = AMQP.connect(AMQP_OPTS.merge(:username => "amqp_gem", :password => "amqp_gem_password", :vhost => "/amqp_gem_testbed"))
|
52
54
|
|
53
|
-
done(0.
|
55
|
+
done(0.4) {
|
54
56
|
connection.should be_connected
|
55
57
|
connection.close
|
56
58
|
}
|
@@ -99,10 +101,10 @@ describe "Authentication attempt" do
|
|
99
101
|
|
100
102
|
# assuming there is an account amqp_gem with password of "amqp_gem_password" that has
|
101
103
|
# access to /amqp_gem_testbed
|
102
|
-
context "when amqp_gem/amqp_gem_testbed has access to
|
104
|
+
context "when amqp_gem/amqp_gem_testbed has access to amqp_gem_testbed" do
|
103
105
|
context "and provided credentials are correct" do
|
104
106
|
it "succeeds" do
|
105
|
-
connection = AMQP.connect "amqp://amqp_gem:amqp_gem_password@localhost
|
107
|
+
connection = AMQP.connect "amqp://amqp_gem:amqp_gem_password@localhost/%2Famqp_gem_testbed"
|
106
108
|
|
107
109
|
done(0.3) {
|
108
110
|
connection.should be_connected
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,149 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe AMQP::Client do
|
6
|
+
|
7
|
+
#
|
8
|
+
# Examples
|
9
|
+
#
|
10
|
+
|
11
|
+
|
12
|
+
describe ".parse_connection_uri(connection_string)" do
|
13
|
+
context "when schema is not one of [amqp, amqps]" do
|
14
|
+
it "raises ArgumentError" do
|
15
|
+
expect {
|
16
|
+
described_class.parse_connection_uri("http://dev.rabbitmq.com")
|
17
|
+
}.to raise_error(ArgumentError, /amqp or amqps schema/)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
it "handles amqp:// URIs w/o path part" do
|
23
|
+
val = described_class.parse_connection_uri("amqp://dev.rabbitmq.com")
|
24
|
+
|
25
|
+
val[:vhost].should be_nil # in this case, default / will be used
|
26
|
+
val[:host].should == "dev.rabbitmq.com"
|
27
|
+
val[:port].should == 5672
|
28
|
+
val[:scheme].should == "amqp"
|
29
|
+
val[:ssl].should be_false
|
30
|
+
end
|
31
|
+
|
32
|
+
it "handles amqps:// URIs w/o path part" do
|
33
|
+
val = described_class.parse_connection_uri("amqps://dev.rabbitmq.com")
|
34
|
+
|
35
|
+
val[:vhost].should be_nil
|
36
|
+
val[:host].should == "dev.rabbitmq.com"
|
37
|
+
val[:port].should == 5671
|
38
|
+
val[:scheme].should == "amqps"
|
39
|
+
val[:ssl].should be_true
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
context "when URI ends in a slash" do
|
44
|
+
it "parses vhost as an empty string" do
|
45
|
+
val = described_class.parse_connection_uri("amqp://dev.rabbitmq.com/")
|
46
|
+
|
47
|
+
val[:host].should == "dev.rabbitmq.com"
|
48
|
+
val[:port].should == 5672
|
49
|
+
val[:scheme].should == "amqp"
|
50
|
+
val[:ssl].should be_false
|
51
|
+
val[:vhost].should == ""
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
context "when URI ends in two consecutive slashes (//)" do
|
57
|
+
it "parses vhost as /" do
|
58
|
+
val = described_class.parse_connection_uri("amqp://dev.rabbitmq.com//")
|
59
|
+
|
60
|
+
val[:host].should == "dev.rabbitmq.com"
|
61
|
+
val[:port].should == 5672
|
62
|
+
val[:scheme].should == "amqp"
|
63
|
+
val[:ssl].should be_false
|
64
|
+
val[:vhost].should == "/"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
context "when URI ends in //vault" do
|
70
|
+
it "parses vhost as /vault" do
|
71
|
+
val = described_class.parse_connection_uri("amqp://dev.rabbitmq.com//vault")
|
72
|
+
|
73
|
+
val[:host].should == "dev.rabbitmq.com"
|
74
|
+
val[:port].should == 5672
|
75
|
+
val[:scheme].should == "amqp"
|
76
|
+
val[:ssl].should be_false
|
77
|
+
val[:vhost].should == "/vault"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
context "when URI ends in /%2Fvault" do
|
84
|
+
it "parses vhost as /vault" do
|
85
|
+
val = described_class.parse_connection_uri("amqp://dev.rabbitmq.com/%2Fvault")
|
86
|
+
|
87
|
+
val[:host].should == "dev.rabbitmq.com"
|
88
|
+
val[:port].should == 5672
|
89
|
+
val[:scheme].should == "amqp"
|
90
|
+
val[:ssl].should be_false
|
91
|
+
val[:vhost].should == "/vault"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
|
96
|
+
context "when URI is amqp://dev.rabbitmq.com/i.am.a.vhost.without.slashes" do
|
97
|
+
it "parses vhost as i.am.a.vhost.without.slashes" do
|
98
|
+
val = described_class.parse_connection_uri("amqp://dev.rabbitmq.com/i.am.a.vhost.without.slashes")
|
99
|
+
|
100
|
+
val[:host].should == "dev.rabbitmq.com"
|
101
|
+
val[:port].should == 5672
|
102
|
+
val[:scheme].should == "amqp"
|
103
|
+
val[:ssl].should be_false
|
104
|
+
val[:vhost].should == "i.am.a.vhost.without.slashes"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
context "when URI is amqp://dev.rabbitmq.com/production" do
|
110
|
+
it "parses vhost as production" do
|
111
|
+
val = described_class.parse_connection_uri("amqp://dev.rabbitmq.com/production")
|
112
|
+
|
113
|
+
val[:host].should == "dev.rabbitmq.com"
|
114
|
+
val[:port].should == 5672
|
115
|
+
val[:scheme].should == "amqp"
|
116
|
+
val[:ssl].should be_false
|
117
|
+
val[:vhost].should == "production"
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
|
122
|
+
context "when URI is amqp://dev.rabbitmq.com///a/b/c/d" do
|
123
|
+
it "parses vhost as ///a/b/c/d" do
|
124
|
+
val = described_class.parse_connection_uri("amqp://dev.rabbitmq.com///a/b/c/d")
|
125
|
+
|
126
|
+
val[:host].should == "dev.rabbitmq.com"
|
127
|
+
val[:port].should == 5672
|
128
|
+
val[:scheme].should == "amqp"
|
129
|
+
val[:ssl].should be_false
|
130
|
+
val[:vhost].should == "//a/b/c/d"
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
|
135
|
+
context "when URI has username:password, for instance, amqp://hedgehog:t0ps3kr3t@hub.megacorp.internal" do
|
136
|
+
it "parses them out" do
|
137
|
+
val = described_class.parse_connection_uri("amqp://hedgehog:t0ps3kr3t@hub.megacorp.internal")
|
138
|
+
|
139
|
+
val[:host].should == "hub.megacorp.internal"
|
140
|
+
val[:port].should == 5672
|
141
|
+
val[:scheme].should == "amqp"
|
142
|
+
val[:ssl].should be_false
|
143
|
+
val[:user].should == "hedgehog"
|
144
|
+
val[:pass].should == "t0ps3kr3t"
|
145
|
+
val[:vhost].should be_nil # in this case, default / will be used
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|