stomp 1.4.3 → 1.4.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -11,7 +11,7 @@ module Stomp
11
11
 
12
12
  private
13
13
 
14
- # Support multi-homed servers.
14
+ # Support multi-homed servers.
15
15
  def _expand_hosts(hash)
16
16
  new_hash = hash.clone
17
17
  new_hash[:hosts_cloned] = hash[:hosts].clone
@@ -137,8 +137,16 @@ module Stomp
137
137
  rescue Exception => aex
138
138
  raise if aex.is_a?(Stomp::Error::LoggerConnectionError)
139
139
  end
140
-
141
- raise Stomp::Error::MaxReconnectAttempts if max_reconnect_attempts?
140
+ if max_reconnect_attempts?
141
+ $stderr.print "In socket() Reached MaxReconnectAttempts"
142
+ ### _dump_threads()
143
+ mt = @parameters[:client_main]
144
+ if !mt.nil?
145
+ mt.raise Stomp::Error::MaxReconnectAttempts
146
+ Thread::exit
147
+ end
148
+ raise Stomp::Error::MaxReconnectAttempts
149
+ end
142
150
  sleep(@reconnect_delay)
143
151
  @connection_attempts += 1
144
152
 
@@ -236,11 +244,14 @@ module Stomp
236
244
  # __old_receive receives a frame, blocks until the frame is received.
237
245
  def __old_receive()
238
246
  # The receive may fail so we may need to retry.
239
- while TRUE
247
+ while true
240
248
  begin
241
249
  used_socket = socket()
242
250
  return _receive(used_socket)
243
251
  rescue Stomp::Error::MaxReconnectAttempts
252
+ unless slog(:on_miscerr, log_params, "Reached MaxReconnectAttempts")
253
+ $stderr.print "Reached MaxReconnectAttempts\n"
254
+ end
244
255
  raise
245
256
  rescue
246
257
  @failure = $!
@@ -274,4 +285,3 @@ module Stomp
274
285
  end # class Connection
275
286
 
276
287
  end # module Stomp
277
-
@@ -88,6 +88,8 @@ module Stomp
88
88
 
89
89
  @logger = @parameters[:logger] ||= Stomp::NullLogger.new
90
90
  @start_timeout = @parameters[:start_timeout] || 0
91
+ @parameters[:client_main] = Thread::current
92
+ ## p [ "CLINDBG", @parameters[:client_main] ]
91
93
  check_arguments!()
92
94
 
93
95
  # p [ "cldbg01", @parameters ]
@@ -170,22 +172,26 @@ module Stomp
170
172
  # which will be used as a callback listener.
171
173
  # Accepts a transaction header ( :transaction => 'some_transaction_id' ).
172
174
  def subscribe(destination, headers = {})
173
- raise "No listener given" unless block_given?
175
+ raise Stomp::Error::NoListenerGiven unless block_given?
176
+ headers = headers.symbolize_keys
177
+ raise Stomp::Error::DestinationRequired unless destination
174
178
  # use subscription id to correlate messages to subscription. As described in
175
179
  # the SUBSCRIPTION section of the protocol: http://stomp.github.com/.
176
180
  # If no subscription id is provided, generate one.
177
181
  headers = headers.merge(:id => build_subscription_id(destination, headers))
178
182
  if @listeners[headers[:id]]
179
- raise "attempting to subscribe to a queue with a previous subscription"
183
+ raise Stomp::Error::DuplicateSubscription
180
184
  end
181
185
  @listeners[headers[:id]] = lambda {|msg| yield msg}
182
186
  @connection.subscribe(destination, headers)
183
187
  end
184
188
 
185
189
  # Unsubscribe from a subscription by name.
186
- def unsubscribe(name, headers = {})
187
- headers = headers.merge(:id => build_subscription_id(name, headers))
188
- @connection.unsubscribe(name, headers)
190
+ def unsubscribe(destination, headers = {})
191
+ headers = headers.symbolize_keys
192
+ raise Stomp::Error::DestinationRequired unless destination
193
+ headers = headers.merge(:id => build_subscription_id(destination, headers))
194
+ @connection.unsubscribe(destination, headers)
189
195
  @listeners[headers[:id]] = nil
190
196
  end
191
197
 
@@ -243,6 +249,8 @@ module Stomp
243
249
  # block on receipt.
244
250
  # Accepts a transaction header ( :transaction => 'some_transaction_id' ).
245
251
  def publish(destination, message, headers = {})
252
+ headers = headers.symbolize_keys
253
+ raise Stomp::Error::DestinationRequired unless destination
246
254
  if block_given?
247
255
  headers = headers.merge(:receipt => register_receipt_listener(lambda {|r| yield r}))
248
256
  end
@@ -351,4 +359,3 @@ module Stomp
351
359
  end # Class
352
360
 
353
361
  end # Module
354
-
@@ -156,6 +156,7 @@ module Stomp
156
156
  @transmit_semaphore = Mutex.new
157
157
  @read_semaphore = Mutex.new
158
158
  @socket_semaphore = Mutex.new
159
+ @gets_semaphore = Mutex.new
159
160
 
160
161
  @subscriptions = {}
161
162
  @failure = nil
@@ -335,12 +336,13 @@ module Stomp
335
336
 
336
337
  # Subscribe subscribes to a destination. A subscription name is required.
337
338
  # For Stomp 1.1+ a session unique subscription ID is also required.
338
- def subscribe(name, headers = {}, subId = nil)
339
+ def subscribe(destination, headers = {}, subId = nil)
339
340
  raise Stomp::Error::NoCurrentConnection if @closed_check && closed?
340
341
  raise Stomp::Error::ProtocolErrorEmptyHeaderKey if headers.has_key?("")
341
342
  raise Stomp::Error::ProtocolErrorEmptyHeaderValue if @protocol == Stomp::SPL_10 && headers.has_value?("")
342
343
  headers = headers.symbolize_keys
343
- headers[:destination] = name
344
+ raise Stomp::Error::DestinationRequired unless destination
345
+ headers[:destination] = destination
344
346
  if @protocol >= Stomp::SPL_11
345
347
  raise Stomp::Error::SubscriptionRequiredError if (headers[:id].nil? && subId.nil?)
346
348
  headers[:id] = subId if headers[:id].nil?
@@ -350,7 +352,7 @@ module Stomp
350
352
 
351
353
  # Store the subscription so that we can replay if we reconnect.
352
354
  if @reliable
353
- subId = name if subId.nil?
355
+ subId = destination if subId.nil?
354
356
  raise Stomp::Error::DuplicateSubscription if @subscriptions[subId]
355
357
  @subscriptions[subId] = headers
356
358
  end
@@ -360,12 +362,13 @@ module Stomp
360
362
 
361
363
  # Unsubscribe from a destination. A subscription name is required.
362
364
  # For Stomp 1.1+ a session unique subscription ID is also required.
363
- def unsubscribe(dest, headers = {}, subId = nil)
365
+ def unsubscribe(destination, headers = {}, subId = nil)
364
366
  raise Stomp::Error::NoCurrentConnection if @closed_check && closed?
365
367
  raise Stomp::Error::ProtocolErrorEmptyHeaderKey if headers.has_key?("")
366
368
  raise Stomp::Error::ProtocolErrorEmptyHeaderValue if @protocol == Stomp::SPL_10 && headers.has_value?("")
367
369
  headers = headers.symbolize_keys
368
- headers[:destination] = dest
370
+ raise Stomp::Error::DestinationRequired unless destination
371
+ headers[:destination] = destination
369
372
  if @protocol >= Stomp::SPL_11
370
373
  raise Stomp::Error::SubscriptionRequiredError if (headers[:id].nil? && subId.nil?)
371
374
  headers[:id] = subId unless headers[:id]
@@ -374,7 +377,7 @@ module Stomp
374
377
  slog(:on_unsubscribe, log_params, headers)
375
378
  transmit(Stomp::CMD_UNSUBSCRIBE, headers)
376
379
  if @reliable
377
- subId = dest if subId.nil?
380
+ subId = destination if subId.nil?
378
381
  @subscriptions.delete(subId)
379
382
  end
380
383
  end
@@ -387,6 +390,7 @@ module Stomp
387
390
  raise Stomp::Error::ProtocolErrorEmptyHeaderKey if headers.has_key?("")
388
391
  raise Stomp::Error::ProtocolErrorEmptyHeaderValue if @protocol == Stomp::SPL_10 && headers.has_value?("")
389
392
  headers = headers.symbolize_keys
393
+ raise Stomp::Error::DestinationRequired unless destination
390
394
  headers[:destination] = destination
391
395
  _headerCheck(headers)
392
396
  slog(:on_publish, log_params, message, headers)
@@ -26,10 +26,10 @@ module Stomp
26
26
  SPL_11 = "1.1"
27
27
  SPL_12 = "1.2"
28
28
 
29
- # Stomp 1.0 and 1.1
29
+ # Stomp 1.0 and 1.1 and 1.2
30
30
  SUPPORTED = [SPL_10, SPL_11, SPL_12]
31
31
 
32
- # 1.9 Encoding Name
32
+ # UTF-8 Encoding Name
33
33
  UTF8 = "UTF-8"
34
34
  #
35
35
  # Octet 0
@@ -175,8 +175,10 @@ module Stomp
175
175
  ["SRP-RSA-AES-256-CBC-SHA","TLSv1/SSLv3",256,256],
176
176
  ]
177
177
 
178
+ HAND_SHAKE_DATA = "\x15\x03\x03\x00\x02\x02\n"
179
+
178
180
  original_verbose, $VERBOSE = $VERBOSE, nil # try to shut off warnings
179
-
181
+
180
182
  # stomp URL regex pattern, for e.g. login:passcode@host:port or host:port
181
183
  URL_REPAT = '((([\w~!@#$%^&*()\-+=.?:<>,.]*\w):([\w~!@#$%^&*()\-+=.?:<>,.]*))?@)?([\w\.\-]+):(\d+)'
182
184
 
@@ -185,5 +187,5 @@ module Stomp
185
187
  FAILOVER_REGEX = /^failover:(\/\/)?\(stomp(\+ssl)?:\/\/#{URL_REPAT}(,stomp(\+ssl)?:\/\/#{URL_REPAT})*\)(\?(.*))?$/
186
188
 
187
189
  $VERBOSE = original_verbose
188
-
190
+
189
191
  end # Module Stomp
@@ -5,6 +5,22 @@ module Stomp
5
5
  # Module level container for Stomp gem error classes.
6
6
  module Error
7
7
 
8
+ # NoListenerGiven is raised if:
9
+ # * No listener block is passed to Client#subscribe
10
+ class NoListenerGiven < RuntimeError
11
+ def message
12
+ "No listener given"
13
+ end
14
+ end
15
+
16
+ # DestinationRequired is raised if:
17
+ # * No destination is passed to subscribe, unsubscribe, publish
18
+ class DestinationRequired < RuntimeError
19
+ def message
20
+ "Destination required"
21
+ end
22
+ end
23
+
8
24
  # InvalidFormat is raised if:
9
25
  # * During frame parsing if a malformed frame is detected.
10
26
  class InvalidFormat < RuntimeError
@@ -216,7 +232,7 @@ module Stomp
216
232
  end
217
233
  end
218
234
 
219
- # LoggerConnectionError is not raised by the gem. It may be
235
+ # LoggerConnectionError is not raised by the gem. It may be
220
236
  # raised by client logic in callback logger methods to signal
221
237
  # that a connection should not proceed.
222
238
  class LoggerConnectionError < RuntimeError
@@ -298,7 +314,14 @@ module Stomp
298
314
  end
299
315
  end
300
316
 
317
+ # HandShakeDetectedError is raised if:
318
+ # * A normal read detects inbound handskake data
319
+ class HandShakeDetectedError < RuntimeError
320
+ def message
321
+ "Handshake data found, possible mismatched port and sslparams"
322
+ end
323
+ end
324
+
301
325
  end # module Error
302
326
 
303
327
  end # module Stomp
304
-
@@ -4,10 +4,10 @@ module Stomp
4
4
 
5
5
  # Define the gem version.
6
6
  module Version #:nodoc: all
7
- MAJOR = 1
8
- MINOR = 4
9
- PATCH = "3"
10
- # PATCH = "3.plvl.001"
7
+ MAJOR = 1
8
+ MINOR = 4
9
+ PATCH = 4
10
+ # PATCH = "4.plvl.001"
11
11
  STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
12
12
  end
13
13
  end
@@ -132,6 +132,7 @@ describe Stomp::Client do
132
132
  describe "(created with positional params)" do
133
133
  before(:each) do
134
134
  @client = Stomp::Client.new('testlogin', 'testpassword', 'localhost', '12345', false)
135
+ @cli_thread = @client.parameters[:client_main]
135
136
  end
136
137
 
137
138
  it "should properly parse the URL provided" do
@@ -140,7 +141,8 @@ describe Stomp::Client do
140
141
  :host => 'localhost',
141
142
  :port => 12345}],
142
143
  :logger => null_logger,
143
- :reliable => false)
144
+ :reliable => false,
145
+ :client_main => @cli_thread)
144
146
  Stomp::Client.new('testlogin', 'testpassword', 'localhost', '12345', false)
145
147
  end
146
148
 
@@ -151,6 +153,7 @@ describe Stomp::Client do
151
153
  describe "(created with non-authenticating stomp:// URL and non-TLD host)" do
152
154
  before(:each) do
153
155
  @client = Stomp::Client.new('stomp://foobar:12345')
156
+ @cli_thread = @client.parameters[:client_main]
154
157
  end
155
158
 
156
159
  it "should properly parse the URL provided" do
@@ -159,7 +162,8 @@ describe Stomp::Client do
159
162
  :host => 'foobar',
160
163
  :port => 12345}],
161
164
  :logger => null_logger,
162
- :reliable => false)
165
+ :reliable => false,
166
+ :client_main => @cli_thread)
163
167
  Stomp::Client.new('stomp://foobar:12345')
164
168
  end
165
169
 
@@ -171,6 +175,7 @@ describe Stomp::Client do
171
175
 
172
176
  before(:each) do
173
177
  @client = Stomp::Client.new('stomp://foo-bar:12345')
178
+ @cli_thread = @client.parameters[:client_main]
174
179
  end
175
180
 
176
181
  it "should properly parse the URL provided" do
@@ -179,7 +184,8 @@ describe Stomp::Client do
179
184
  :host => 'foo-bar',
180
185
  :port => 12345}],
181
186
  :logger => null_logger,
182
- :reliable => false)
187
+ :reliable => false,
188
+ :client_main => @cli_thread)
183
189
  Stomp::Client.new('stomp://foo-bar:12345')
184
190
  end
185
191
 
@@ -191,6 +197,7 @@ describe Stomp::Client do
191
197
 
192
198
  before(:each) do
193
199
  @client = Stomp::Client.new('stomp://test-login:testpasscode@foobar:12345')
200
+ @cli_thread = @client.parameters[:client_main]
194
201
  end
195
202
 
196
203
  it "should properly parse the URL provided" do
@@ -199,7 +206,8 @@ describe Stomp::Client do
199
206
  :host => 'foobar',
200
207
  :port => 12345}],
201
208
  :logger => null_logger,
202
- :reliable => false)
209
+ :reliable => false,
210
+ :client_main => @cli_thread)
203
211
  Stomp::Client.new('stomp://test-login:testpasscode@foobar:12345')
204
212
  end
205
213
 
@@ -211,6 +219,7 @@ describe Stomp::Client do
211
219
 
212
220
  before(:each) do
213
221
  @client = Stomp::Client.new('stomp://test-login:testpasscode@foo-bar:12345')
222
+ @cli_thread = @client.parameters[:client_main]
214
223
  end
215
224
 
216
225
  it "should properly parse the URL provided" do
@@ -219,7 +228,8 @@ describe Stomp::Client do
219
228
  :host => 'foo-bar',
220
229
  :port => 12345}],
221
230
  :logger => null_logger,
222
- :reliable => false)
231
+ :reliable => false,
232
+ :client_main => @cli_thread)
223
233
  Stomp::Client.new('stomp://test-login:testpasscode@foo-bar:12345')
224
234
  end
225
235
 
@@ -231,6 +241,7 @@ describe Stomp::Client do
231
241
 
232
242
  before(:each) do
233
243
  @client = Stomp::Client.new('stomp://host.foobar.com:12345')
244
+ @cli_thread = @client.parameters[:client_main]
234
245
  end
235
246
 
236
247
  after(:each) do
@@ -242,7 +253,8 @@ describe Stomp::Client do
242
253
  :host => 'host.foobar.com',
243
254
  :port => 12345}],
244
255
  :logger => null_logger,
245
- :reliable => false)
256
+ :reliable => false,
257
+ :client_main => @cli_thread)
246
258
  Stomp::Client.new('stomp://host.foobar.com:12345')
247
259
  end
248
260
 
@@ -254,6 +266,7 @@ describe Stomp::Client do
254
266
 
255
267
  before(:each) do
256
268
  @client = Stomp::Client.new('stomp://testlogin:testpasscode@host.foobar.com:12345')
269
+ @cli_thread = @client.parameters[:client_main]
257
270
  end
258
271
 
259
272
  it "should properly parse the URL provided" do
@@ -262,7 +275,8 @@ describe Stomp::Client do
262
275
  :host => 'host.foobar.com',
263
276
  :port => 12345}],
264
277
  :logger => null_logger,
265
- :reliable => false)
278
+ :reliable => false,
279
+ :client_main => @cli_thread)
266
280
  Stomp::Client.new('stomp://testlogin:testpasscode@host.foobar.com:12345')
267
281
  end
268
282
 
@@ -272,6 +286,8 @@ describe Stomp::Client do
272
286
 
273
287
  describe "(created with failover URL)" do
274
288
  before(:each) do
289
+ @client = Stomp::Client.new('failover://(stomp://login1:passcode1@localhost:61616,stomp://login2:passcode2@remotehost:61617)')
290
+ @cli_thread = @client.parameters[:client_main]
275
291
  #default options
276
292
  @parameters = {
277
293
  :initial_reconnect_delay => 0.01,
@@ -286,17 +302,14 @@ describe Stomp::Client do
286
302
  end
287
303
  it "should properly parse a URL with failover://" do
288
304
  url = "failover://(stomp://login1:passcode1@localhost:61616,stomp://login2:passcode2@remotehost:61617)"
289
-
290
305
  @parameters[:hosts] = [
291
306
  {:login => "login1", :passcode => "passcode1", :host => "localhost", :port => 61616, :ssl => false},
292
307
  {:login => "login2", :passcode => "passcode2", :host => "remotehost", :port => 61617, :ssl => false}
293
308
  ]
294
-
295
309
  @parameters.merge!({:logger => null_logger})
296
-
297
310
  expect(Stomp::Connection).to receive(:new).with(@parameters)
298
-
299
- client = Stomp::Client.new(url)
311
+ @parameters[:client_main] = @cli_thread
312
+ client = Stomp::Client.new(url)
300
313
  expect(client.parameters).to eq(@parameters)
301
314
  end
302
315
 
@@ -310,9 +323,8 @@ describe Stomp::Client do
310
323
  ]
311
324
 
312
325
  @parameters.merge!({:logger => null_logger})
313
-
326
+ @parameters[:client_main] = @cli_thread
314
327
  expect(Stomp::Connection).to receive(:new).with(@parameters)
315
-
316
328
  client = Stomp::Client.new(url)
317
329
  expect(client.parameters).to eq(@parameters)
318
330
  end
@@ -326,10 +338,11 @@ describe Stomp::Client do
326
338
  ]
327
339
 
328
340
  @parameters.merge!({:logger => null_logger})
329
-
341
+ @parameters[:client_main] = @cli_thread
330
342
  expect(Stomp::Connection).to receive(:new).with(@parameters)
331
343
 
332
344
  client = Stomp::Client.new(url)
345
+ @parameters[:client_main] = client.parameters[:client_main]
333
346
  expect(client.parameters).to eq(@parameters)
334
347
  end
335
348
 
@@ -342,10 +355,11 @@ describe Stomp::Client do
342
355
  ]
343
356
 
344
357
  @parameters.merge!({:logger => null_logger})
345
-
358
+ @parameters[:client_main] = @cli_thread
346
359
  expect(Stomp::Connection).to receive(:new).with(@parameters)
347
360
 
348
361
  client = Stomp::Client.new(url)
362
+ @parameters[:client_main] = client.parameters[:client_main]
349
363
  expect(client.parameters).to eq(@parameters)
350
364
  end
351
365
 
@@ -373,10 +387,11 @@ describe Stomp::Client do
373
387
  ]
374
388
 
375
389
  @parameters.merge!({:logger => null_logger})
376
-
390
+ @parameters[:client_main] = @cli_thread
377
391
  expect(Stomp::Connection).to receive(:new).with(@parameters)
378
392
 
379
393
  client = Stomp::Client.new(url)
394
+ @parameters[:client_main] = client.parameters[:client_main]
380
395
  expect(client.parameters).to eq(@parameters)
381
396
  end
382
397
 
@@ -419,7 +434,7 @@ describe Stomp::Client do
419
434
  describe 'given headers hash' do
420
435
  subject { headers }
421
436
  it 'is immutable' do
422
- is_expected.to match(original_headers)
437
+ expect match(original_headers)
423
438
  end
424
439
  end
425
440
  end