amqp 0.7.0.pre → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/.rspec +2 -0
- data/CHANGELOG +8 -2
- data/CONTRIBUTORS +22 -0
- data/Gemfile +3 -3
- data/README.md +20 -11
- data/Rakefile +30 -6
- data/amqp.gemspec +1 -1
- data/bin/cleanify.rb +50 -0
- data/examples/amqp/simple.rb +6 -4
- data/examples/mq/ack.rb +8 -6
- data/examples/mq/automatic_binding_for_default_direct_exchange.rb +65 -0
- data/examples/mq/callbacks.rb +9 -1
- data/examples/mq/clock.rb +17 -17
- data/examples/mq/hashtable.rb +19 -10
- data/examples/mq/internal.rb +13 -11
- data/examples/mq/logger.rb +38 -36
- data/examples/mq/multiclock.rb +16 -7
- data/examples/mq/pingpong.rb +16 -7
- data/examples/mq/pop.rb +8 -6
- data/examples/mq/primes-simple.rb +2 -0
- data/examples/mq/primes.rb +7 -5
- data/examples/mq/stocks.rb +14 -5
- data/lib/amqp.rb +12 -8
- data/lib/amqp/buffer.rb +35 -158
- data/lib/amqp/client.rb +34 -22
- data/lib/amqp/frame.rb +8 -64
- data/lib/amqp/protocol.rb +21 -70
- data/lib/amqp/server.rb +11 -9
- data/lib/amqp/spec.rb +8 -6
- data/lib/amqp/version.rb +2 -0
- data/lib/ext/blankslate.rb +3 -1
- data/lib/ext/em.rb +2 -0
- data/lib/ext/emfork.rb +13 -11
- data/lib/mq.rb +253 -156
- data/lib/mq/collection.rb +6 -88
- data/lib/mq/exchange.rb +70 -13
- data/lib/mq/header.rb +12 -6
- data/lib/mq/logger.rb +9 -7
- data/lib/mq/queue.rb +42 -30
- data/lib/mq/rpc.rb +6 -4
- data/protocol/codegen.rb +20 -18
- data/research/api.rb +10 -46
- data/research/primes-forked.rb +9 -7
- data/research/primes-processes.rb +74 -72
- data/research/primes-threaded.rb +9 -7
- data/spec/integration/automatic_binding_for_default_direct_exchange_spec.rb +61 -0
- data/spec/mq_helper.rb +70 -0
- data/spec/spec_helper.rb +84 -29
- data/spec/unit/amqp/buffer_spec.rb +178 -0
- data/spec/unit/amqp/client_spec.rb +472 -0
- data/spec/unit/amqp/frame_spec.rb +60 -0
- data/spec/unit/amqp/misc_spec.rb +123 -0
- data/spec/unit/amqp/protocol_spec.rb +53 -0
- data/spec/unit/mq/channel_close_spec.rb +15 -0
- data/spec/unit/mq/collection_spec.rb +129 -0
- data/spec/unit/mq/exchange_declaration_spec.rb +524 -0
- data/spec/unit/mq/misc_spec.rb +228 -0
- data/spec/unit/mq/mq_basic_spec.rb +39 -0
- data/spec/unit/mq/queue_declaration_spec.rb +97 -0
- data/spec/unit/mq/queue_spec.rb +71 -0
- metadata +33 -21
- data/Gemfile.lock +0 -16
- data/old/README +0 -30
- data/old/Rakefile +0 -12
- data/old/amqp-0.8.json +0 -606
- data/old/amqp_spec.rb +0 -796
- data/old/amqpc.rb +0 -695
- data/old/codegen.rb +0 -148
- data/spec/channel_close_spec.rb +0 -13
- data/spec/sync_async_spec.rb +0 -52
data/lib/amqp.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
require File.expand_path('../ext/em', __FILE__)
|
2
4
|
require File.expand_path('../ext/blankslate', __FILE__)
|
3
|
-
|
5
|
+
|
4
6
|
%w[ version buffer spec protocol frame client ].each do |file|
|
5
7
|
require File.expand_path("../amqp/#{file}", __FILE__)
|
6
8
|
end
|
@@ -76,7 +78,7 @@ module AMQP
|
|
76
78
|
# block. See the code examples in MQ for details.
|
77
79
|
#
|
78
80
|
def self.start *args, &blk
|
79
|
-
EM.run{
|
81
|
+
EM.run {
|
80
82
|
@conn ||= connect *args
|
81
83
|
@conn.callback(&blk) if blk
|
82
84
|
@conn
|
@@ -86,15 +88,17 @@ module AMQP
|
|
86
88
|
class << self
|
87
89
|
alias :run :start
|
88
90
|
end
|
89
|
-
|
91
|
+
|
90
92
|
def self.stop
|
91
93
|
if @conn and not @closing
|
92
94
|
@closing = true
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
95
|
+
EM.next_tick do
|
96
|
+
@conn.close {
|
97
|
+
yield if block_given?
|
98
|
+
@conn = nil
|
99
|
+
@closing = false
|
100
|
+
}
|
101
|
+
end
|
98
102
|
end
|
99
103
|
end
|
100
104
|
|
data/lib/amqp/buffer.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
if [].map.respond_to? :with_index
|
2
4
|
class Array #:nodoc:
|
3
5
|
def enum_with_index
|
@@ -12,14 +14,14 @@ module AMQP
|
|
12
14
|
class Buffer #:nodoc: all
|
13
15
|
class Overflow < StandardError; end
|
14
16
|
class InvalidType < StandardError; end
|
15
|
-
|
16
|
-
def initialize
|
17
|
+
|
18
|
+
def initialize(data = '')
|
17
19
|
@data = data
|
18
20
|
@pos = 0
|
19
21
|
end
|
20
22
|
|
21
23
|
attr_reader :pos
|
22
|
-
|
24
|
+
|
23
25
|
def data
|
24
26
|
@data.clone
|
25
27
|
end
|
@@ -30,22 +32,22 @@ module AMQP
|
|
30
32
|
@data << data.to_s
|
31
33
|
self
|
32
34
|
end
|
33
|
-
|
35
|
+
|
34
36
|
def length
|
35
37
|
@data.bytesize
|
36
38
|
end
|
37
|
-
|
39
|
+
|
38
40
|
def empty?
|
39
41
|
pos == length
|
40
42
|
end
|
41
|
-
|
43
|
+
|
42
44
|
def rewind
|
43
45
|
@pos = 0
|
44
46
|
end
|
45
|
-
|
46
|
-
def read_properties
|
47
|
+
|
48
|
+
def read_properties(*types)
|
47
49
|
types.shift if types.first == :properties
|
48
|
-
|
50
|
+
|
49
51
|
i = 0
|
50
52
|
values = []
|
51
53
|
|
@@ -53,9 +55,9 @@ module AMQP
|
|
53
55
|
(0..14).each do |n|
|
54
56
|
# no more property types
|
55
57
|
break unless types[i]
|
56
|
-
|
58
|
+
|
57
59
|
# if flag is set
|
58
|
-
if props & (1<<(15-n)) != 0
|
60
|
+
if props & (1 << (15-n)) != 0
|
59
61
|
if types[i] == :bit
|
60
62
|
# bit values exist in flags only
|
61
63
|
values << true
|
@@ -68,7 +70,7 @@ module AMQP
|
|
68
70
|
values << (types[i] == :bit ? false : nil)
|
69
71
|
end
|
70
72
|
|
71
|
-
i+=1
|
73
|
+
i += 1
|
72
74
|
end
|
73
75
|
|
74
76
|
# bit(0) == 0 means no more property flags
|
@@ -80,7 +82,7 @@ module AMQP
|
|
80
82
|
end
|
81
83
|
end
|
82
84
|
|
83
|
-
def read
|
85
|
+
def read(*types)
|
84
86
|
if types.first == :properties
|
85
87
|
return read_properties(*types)
|
86
88
|
end
|
@@ -129,7 +131,7 @@ module AMQP
|
|
129
131
|
when :bit
|
130
132
|
if (@bits ||= []).empty?
|
131
133
|
val = read(:octet)
|
132
|
-
@bits = (0..7).map{|i| (val & 1<<i) != 0 }
|
134
|
+
@bits = (0..7).map { |i| (val & 1 << i) != 0 }
|
133
135
|
end
|
134
136
|
|
135
137
|
@bits.shift
|
@@ -137,11 +139,11 @@ module AMQP
|
|
137
139
|
raise InvalidType, "Cannot read data of type #{type}"
|
138
140
|
end
|
139
141
|
end
|
140
|
-
|
142
|
+
|
141
143
|
types.size == 1 ? values.first : values
|
142
144
|
end
|
143
|
-
|
144
|
-
def write
|
145
|
+
|
146
|
+
def write(type, data)
|
145
147
|
case type
|
146
148
|
when :octet
|
147
149
|
_write(data, 'C')
|
@@ -195,9 +197,9 @@ module AMQP
|
|
195
197
|
table
|
196
198
|
end)
|
197
199
|
when :bit
|
198
|
-
[*data].to_enum(:each_slice, 8).each{|bits|
|
199
|
-
write(:octet, bits.enum_with_index.inject(0){ |byte, (bit, i)|
|
200
|
-
byte |= 1<<i if bit
|
200
|
+
[*data].to_enum(:each_slice, 8).each { |bits|
|
201
|
+
write(:octet, bits.enum_with_index.inject(0) { |byte, (bit, i)|
|
202
|
+
byte |= 1 << i if bit
|
201
203
|
byte
|
202
204
|
})
|
203
205
|
}
|
@@ -209,10 +211,10 @@ module AMQP
|
|
209
211
|
|
210
212
|
if (n == 0 and i != 0) or last
|
211
213
|
if data.size > i+1
|
212
|
-
short |= 1<<0
|
214
|
+
short |= 1 << 0
|
213
215
|
elsif last and value
|
214
|
-
values << [type,value]
|
215
|
-
short |= 1<<(15-n)
|
216
|
+
values << [type, value]
|
217
|
+
short |= 1 << (15-n)
|
216
218
|
end
|
217
219
|
|
218
220
|
write(:short, short)
|
@@ -220,20 +222,20 @@ module AMQP
|
|
220
222
|
end
|
221
223
|
|
222
224
|
if value and !last
|
223
|
-
values << [type,value]
|
224
|
-
short |= 1<<(15-n)
|
225
|
+
values << [type, value]
|
226
|
+
short |= 1 << (15-n)
|
225
227
|
end
|
226
228
|
|
227
229
|
short
|
228
230
|
end
|
229
|
-
|
231
|
+
|
230
232
|
values.each do |type, value|
|
231
233
|
write(type, value) unless type == :bit
|
232
234
|
end
|
233
235
|
else
|
234
236
|
raise InvalidType, "Cannot write data of type #{type}"
|
235
237
|
end
|
236
|
-
|
238
|
+
|
237
239
|
self
|
238
240
|
end
|
239
241
|
|
@@ -247,12 +249,12 @@ module AMQP
|
|
247
249
|
end
|
248
250
|
end
|
249
251
|
|
250
|
-
def _read
|
252
|
+
def _read(size, pack = nil)
|
251
253
|
if @pos + size > length
|
252
254
|
raise Overflow
|
253
255
|
else
|
254
|
-
data = @data[@pos,size]
|
255
|
-
@data[@pos,size] = ''
|
256
|
+
data = @data[@pos, size]
|
257
|
+
@data[@pos, size] = ''
|
256
258
|
if pack
|
257
259
|
data = data.unpack(pack)
|
258
260
|
data = data.pop if data.size == 1
|
@@ -260,136 +262,11 @@ module AMQP
|
|
260
262
|
data
|
261
263
|
end
|
262
264
|
end
|
263
|
-
|
264
|
-
def _write
|
265
|
+
|
266
|
+
def _write(data, pack = nil)
|
265
267
|
data = [*data].pack(pack) if pack
|
266
|
-
@data[@pos,0] = data
|
268
|
+
@data[@pos, 0] = data
|
267
269
|
@pos += data.bytesize
|
268
270
|
end
|
269
271
|
end
|
270
272
|
end
|
271
|
-
|
272
|
-
if $0 =~ /bacon/ or $0 == __FILE__
|
273
|
-
require 'bacon'
|
274
|
-
include AMQP
|
275
|
-
|
276
|
-
describe Buffer do
|
277
|
-
before do
|
278
|
-
@buf = Buffer.new
|
279
|
-
end
|
280
|
-
|
281
|
-
should 'have contents' do
|
282
|
-
@buf.contents.should == ''
|
283
|
-
end
|
284
|
-
|
285
|
-
should 'initialize with data' do
|
286
|
-
@buf = Buffer.new('abc')
|
287
|
-
@buf.contents.should == 'abc'
|
288
|
-
end
|
289
|
-
|
290
|
-
should 'append raw data' do
|
291
|
-
@buf << 'abc'
|
292
|
-
@buf << 'def'
|
293
|
-
@buf.contents.should == 'abcdef'
|
294
|
-
end
|
295
|
-
|
296
|
-
should 'append other buffers' do
|
297
|
-
@buf << Buffer.new('abc')
|
298
|
-
@buf.data.should == 'abc'
|
299
|
-
end
|
300
|
-
|
301
|
-
should 'have a position' do
|
302
|
-
@buf.pos.should == 0
|
303
|
-
end
|
304
|
-
|
305
|
-
should 'have a length' do
|
306
|
-
@buf.length.should == 0
|
307
|
-
@buf << 'abc'
|
308
|
-
@buf.length.should == 3
|
309
|
-
end
|
310
|
-
|
311
|
-
should 'know the end' do
|
312
|
-
@buf.empty?.should == true
|
313
|
-
end
|
314
|
-
|
315
|
-
should 'read and write data' do
|
316
|
-
@buf._write('abc')
|
317
|
-
@buf.rewind
|
318
|
-
@buf._read(2).should == 'ab'
|
319
|
-
@buf._read(1).should == 'c'
|
320
|
-
end
|
321
|
-
|
322
|
-
should 'raise on overflow' do
|
323
|
-
lambda{ @buf._read(1) }.should.raise Buffer::Overflow
|
324
|
-
end
|
325
|
-
|
326
|
-
should 'raise on invalid types' do
|
327
|
-
lambda{ @buf.read(:junk) }.should.raise Buffer::InvalidType
|
328
|
-
lambda{ @buf.write(:junk, 1) }.should.raise Buffer::InvalidType
|
329
|
-
end
|
330
|
-
|
331
|
-
{ :octet => 0b10101010,
|
332
|
-
:short => 100,
|
333
|
-
:long => 100_000_000,
|
334
|
-
:longlong => 666_555_444_333_222_111,
|
335
|
-
:shortstr => 'hello',
|
336
|
-
:longstr => 'bye'*500,
|
337
|
-
:timestamp => time = Time.at(Time.now.to_i),
|
338
|
-
:table => { :this => 'is', :a => 'hash', :with => {:nested => 123, :and => time, :also => 123.456} },
|
339
|
-
:bit => true
|
340
|
-
}.each do |type, value|
|
341
|
-
|
342
|
-
should "read and write a #{type}" do
|
343
|
-
@buf.write(type, value)
|
344
|
-
@buf.rewind
|
345
|
-
@buf.read(type).should == value
|
346
|
-
@buf.should.be.empty
|
347
|
-
end
|
348
|
-
|
349
|
-
end
|
350
|
-
|
351
|
-
should 'read and write multiple bits' do
|
352
|
-
bits = [true, false, false, true, true, false, false, true, true, false]
|
353
|
-
@buf.write(:bit, bits)
|
354
|
-
@buf.write(:octet, 100)
|
355
|
-
|
356
|
-
@buf.rewind
|
357
|
-
|
358
|
-
bits.map do
|
359
|
-
@buf.read(:bit)
|
360
|
-
end.should == bits
|
361
|
-
@buf.read(:octet).should == 100
|
362
|
-
end
|
363
|
-
|
364
|
-
should 'read and write properties' do
|
365
|
-
properties = ([
|
366
|
-
[:octet, 1],
|
367
|
-
[:shortstr, 'abc'],
|
368
|
-
[:bit, true],
|
369
|
-
[:bit, false],
|
370
|
-
[:shortstr, nil],
|
371
|
-
[:timestamp, nil],
|
372
|
-
[:table, { :a => 'hash' }],
|
373
|
-
]*5).sort_by{rand}
|
374
|
-
|
375
|
-
@buf.write(:properties, properties)
|
376
|
-
@buf.rewind
|
377
|
-
@buf.read(:properties, *properties.map{|type,_| type }).should == properties.map{|_,value| value }
|
378
|
-
@buf.should.be.empty
|
379
|
-
end
|
380
|
-
|
381
|
-
should 'do transactional reads with #extract' do
|
382
|
-
@buf.write :octet, 8
|
383
|
-
orig = @buf.to_s
|
384
|
-
|
385
|
-
@buf.rewind
|
386
|
-
@buf.extract do |b|
|
387
|
-
b.read :octet
|
388
|
-
b.read :short
|
389
|
-
end
|
390
|
-
|
391
|
-
@buf.pos.should == 0
|
392
|
-
@buf.data.should == orig
|
393
|
-
end
|
394
|
-
end
|
395
|
-
end
|
data/lib/amqp/client.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
require File.expand_path('../frame', __FILE__)
|
2
4
|
|
3
5
|
require 'uri'
|
@@ -6,7 +8,9 @@ module AMQP
|
|
6
8
|
class Error < StandardError; end
|
7
9
|
|
8
10
|
module BasicClient
|
9
|
-
|
11
|
+
attr_reader :broker
|
12
|
+
|
13
|
+
def process_frame(frame)
|
10
14
|
if mq = channels[frame.channel]
|
11
15
|
mq.process_frame(frame)
|
12
16
|
return
|
@@ -16,9 +20,10 @@ module AMQP
|
|
16
20
|
when Frame::Method
|
17
21
|
case method = frame.payload
|
18
22
|
when Protocol::Connection::Start
|
23
|
+
@broker = method
|
19
24
|
send Protocol::Connection::StartOk.new({:platform => 'Ruby/EventMachine',
|
20
25
|
:product => 'AMQP',
|
21
|
-
:information => 'http://github.com/
|
26
|
+
:information => 'http://github.com/ruby-amqp/amqp',
|
22
27
|
:version => VERSION},
|
23
28
|
'AMQPLAIN',
|
24
29
|
{:LOGIN => @settings[:user],
|
@@ -34,6 +39,8 @@ module AMQP
|
|
34
39
|
:capabilities => '',
|
35
40
|
:insist => @settings[:insist])
|
36
41
|
|
42
|
+
@on_disconnect = method(:disconnected)
|
43
|
+
|
37
44
|
when Protocol::Connection::OpenOk
|
38
45
|
succeed(self)
|
39
46
|
|
@@ -60,14 +67,16 @@ module AMQP
|
|
60
67
|
module Client
|
61
68
|
include EM::Deferrable
|
62
69
|
|
63
|
-
def initialize
|
70
|
+
def initialize(opts = {})
|
64
71
|
@settings = opts
|
65
72
|
extend AMQP.client
|
66
73
|
|
67
|
-
@
|
74
|
+
@_channel_mutex = Mutex.new
|
75
|
+
|
76
|
+
@on_disconnect ||= proc { raise Error, "Could not connect to server #{opts[:host]}:#{opts[:port]}" }
|
68
77
|
|
69
78
|
timeout @settings[:timeout] if @settings[:timeout]
|
70
|
-
errback{ @on_disconnect.call } unless @reconnecting
|
79
|
+
errback { @on_disconnect.call } unless @reconnecting
|
71
80
|
|
72
81
|
@connected = false
|
73
82
|
end
|
@@ -75,9 +84,8 @@ module AMQP
|
|
75
84
|
def connection_completed
|
76
85
|
start_tls if @settings[:ssl]
|
77
86
|
log 'connected'
|
78
|
-
# @on_disconnect = proc{ raise Error, 'Disconnected from server' }
|
87
|
+
# @on_disconnect = proc { raise Error, 'Disconnected from server' }
|
79
88
|
unless @closing
|
80
|
-
@on_disconnect = method(:disconnected)
|
81
89
|
@reconnecting = false
|
82
90
|
end
|
83
91
|
|
@@ -96,11 +104,11 @@ module AMQP
|
|
96
104
|
def unbind
|
97
105
|
log 'disconnected'
|
98
106
|
@connected = false
|
99
|
-
EM.next_tick{ @on_disconnect.call }
|
107
|
+
EM.next_tick { @on_disconnect.call }
|
100
108
|
end
|
101
109
|
|
102
|
-
def add_channel
|
103
|
-
|
110
|
+
def add_channel(mq)
|
111
|
+
@_channel_mutex.synchronize do
|
104
112
|
channels[ key = (channels.keys.max || 0) + 1 ] = mq
|
105
113
|
key
|
106
114
|
end
|
@@ -110,7 +118,7 @@ module AMQP
|
|
110
118
|
@channels ||= {}
|
111
119
|
end
|
112
120
|
|
113
|
-
def receive_data
|
121
|
+
def receive_data(data)
|
114
122
|
# log 'receive_data', data
|
115
123
|
@buf << data
|
116
124
|
|
@@ -120,12 +128,12 @@ module AMQP
|
|
120
128
|
end
|
121
129
|
end
|
122
130
|
|
123
|
-
def process_frame
|
131
|
+
def process_frame(frame)
|
124
132
|
# this is a stub meant to be
|
125
133
|
# replaced by the module passed into initialize
|
126
134
|
end
|
127
135
|
|
128
|
-
def send
|
136
|
+
def send(data, opts = {})
|
129
137
|
channel = opts[:channel] ||= 0
|
130
138
|
data = data.to_frame(channel) unless data.is_a? Frame
|
131
139
|
data.channel = channel
|
@@ -141,16 +149,16 @@ module AMQP
|
|
141
149
|
# end
|
142
150
|
#:startdoc:
|
143
151
|
|
144
|
-
def close
|
152
|
+
def close(&on_disconnect)
|
145
153
|
if on_disconnect
|
146
154
|
@closing = true
|
147
|
-
@on_disconnect = proc{
|
155
|
+
@on_disconnect = proc {
|
148
156
|
on_disconnect.call
|
149
157
|
@closing = false
|
150
158
|
}
|
151
159
|
end
|
152
160
|
|
153
|
-
callback{ |c|
|
161
|
+
callback { |c|
|
154
162
|
if c.channels.any?
|
155
163
|
c.channels.each do |ch, mq|
|
156
164
|
mq.close
|
@@ -164,10 +172,14 @@ module AMQP
|
|
164
172
|
}
|
165
173
|
end
|
166
174
|
|
167
|
-
def
|
175
|
+
def closing?
|
176
|
+
@closing
|
177
|
+
end
|
178
|
+
|
179
|
+
def reconnect(force = false)
|
168
180
|
if @reconnecting and not force
|
169
181
|
# wait 1 second after first reconnect attempt, in between each subsequent attempt
|
170
|
-
EM.add_timer(1){ reconnect(true) }
|
182
|
+
EM.add_timer(1) { reconnect(true) }
|
171
183
|
return
|
172
184
|
end
|
173
185
|
|
@@ -179,7 +191,7 @@ module AMQP
|
|
179
191
|
|
180
192
|
mqs = @channels
|
181
193
|
@channels = {}
|
182
|
-
mqs.each{ |_,mq| mq.reset } if mqs
|
194
|
+
mqs.each { |_, mq| mq.reset } if mqs
|
183
195
|
end
|
184
196
|
|
185
197
|
log 'reconnecting'
|
@@ -199,7 +211,7 @@ module AMQP
|
|
199
211
|
EM.connect opts[:host], opts[:port], self, opts
|
200
212
|
end
|
201
213
|
|
202
|
-
def connection_status
|
214
|
+
def connection_status(&blk)
|
203
215
|
@connection_status = blk
|
204
216
|
end
|
205
217
|
|
@@ -210,7 +222,7 @@ module AMQP
|
|
210
222
|
reconnect
|
211
223
|
end
|
212
224
|
|
213
|
-
def log
|
225
|
+
def log(*args)
|
214
226
|
return unless @settings[:logging] or AMQP.logging
|
215
227
|
require 'pp'
|
216
228
|
pp args
|
@@ -226,7 +238,7 @@ module AMQP
|
|
226
238
|
opts[:vhost] = URI.unescape(uri.path) if uri.path
|
227
239
|
opts[:host] = uri.host if uri.host
|
228
240
|
opts[:port] = uri.port ? uri.port :
|
229
|
-
{"amqp"=>5672, "amqps"=>5671}[uri.scheme]
|
241
|
+
{"amqp" => 5672, "amqps" => 5671}[uri.scheme]
|
230
242
|
opts[:ssl] = uri.scheme == "amqps"
|
231
243
|
return opts
|
232
244
|
end
|