stomp 1.4.3 → 1.4.4

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.
@@ -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