stomp 1.4.3 → 1.4.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/README.md +46 -3
- data/examples/artemis/artlogger.rb +41 -0
- data/examples/artemis/cliwaiter_not_reliable.rb +66 -0
- data/examples/artemis/cliwaiter_reliable.rb +61 -0
- data/examples/contrib.sh +2 -2
- data/examples/examplogger.rb +5 -3
- data/examples/ssl_uc1.rb +4 -2
- data/lib/client/utils.rb +10 -7
- data/lib/connection/heartbeats.rb +13 -11
- data/lib/connection/netio.rb +47 -14
- data/lib/connection/utils.rb +15 -5
- data/lib/stomp/client.rb +13 -6
- data/lib/stomp/connection.rb +10 -6
- data/lib/stomp/constants.rb +6 -4
- data/lib/stomp/errors.rb +25 -2
- data/lib/stomp/version.rb +4 -4
- data/spec/client_spec.rb +33 -18
- data/spec/spec_helper.rb +1 -0
- data/stomp.gemspec +21 -17
- data/test/MultiBrokerUnitTestExample.sh +65 -0
- data/test/test_anonymous.rb +29 -47
- data/test/test_client.rb +131 -131
- data/test/test_connection.rb +49 -51
- data/test/test_connection1p.rb +45 -76
- data/test/test_helper.rb +15 -2
- data/test/test_message.rb +18 -35
- data/test/test_ssl.rb +4 -10
- data/test/unitst.sh +3 -2
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 138654f82256d2b0bf65dd034e2a2ec725eefb55
|
4
|
+
data.tar.gz: 72b543959edfb3122a83d7ed9e01b22f54225f72
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 13af9a61a1843e1d08f99430287cd416dca94785287cc2542cfc7979bda7896e295c4085748a4daf8bce1064bfd01e11a2b4325ab60ee7310b8cc553bb504c02
|
7
|
+
data.tar.gz: b8ba033de3d30b6b1502a8e41e2d7015fe37dbb68b37c8e040ee9ec6fddcf2385a84e2295392bfa3eb7aafb93ab888087f17ee7136bf12c36b838410986a132e
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
# Stomp Gem Change Log
|
2
2
|
|
3
|
+
## 1.4.4 20170611
|
4
|
+
|
5
|
+
* Merge fix for issue 141.
|
6
|
+
* Fix broken MatReconnectAttempts
|
7
|
+
* Attempt to detect mismatched SSL port and params.
|
8
|
+
* Issue 139, add ssl checks to receive timeout logic.
|
9
|
+
* Eliminate assert_nothing_raised from tests.
|
10
|
+
* Add Artemis suport to standard test bed.
|
11
|
+
* Run JRuby tests more easily.
|
12
|
+
|
3
13
|
## 1.4.3 20160821
|
4
14
|
|
5
15
|
* Quick fix of install failures. Do not try to use install 1.4.2.
|
data/README.md
CHANGED
@@ -93,6 +93,7 @@ A Stomp URL must begin with 'stomp://' and can be in one of the following forms:
|
|
93
93
|
|
94
94
|
See _CHANGELOG.rdoc_ for details.
|
95
95
|
|
96
|
+
* Gem version 1.4.4. Miscellaneous fixes, see CHANGELOG.rdoc for details.
|
96
97
|
* Gem version 1.4.3. Fix broken install. Do not try to install 1.4.2.
|
97
98
|
* Gem version 1.4.2. Fix memory leak, and others !: see CHANGELOG.md for details.
|
98
99
|
* Gem version 1.4.1. Important SSL changes !: see CHANGELOG.md for details.
|
@@ -293,7 +294,7 @@ Thiago Morello
|
|
293
294
|
2009-12-25
|
294
295
|
</td>
|
295
296
|
<td style="border: 1px solid black;padding-left: 10px;" >
|
296
|
-
(
|
297
|
+
(0387)
|
297
298
|
</td>
|
298
299
|
<td style="border: 1px solid black;padding-left: 10px;" >
|
299
300
|
<span style="font-weight: bold;" >
|
@@ -321,7 +322,7 @@ Rafael Rosa
|
|
321
322
|
2010-03-23
|
322
323
|
</td>
|
323
324
|
<td style="border: 1px solid black;padding-left: 10px;" >
|
324
|
-
(
|
325
|
+
(0042)
|
325
326
|
</td>
|
326
327
|
<td style="border: 1px solid black;padding-left: 10px;" >
|
327
328
|
<span style="font-weight: bold;" >
|
@@ -727,7 +728,7 @@ Nikolay Khasanov
|
|
727
728
|
2016-07-16
|
728
729
|
</td>
|
729
730
|
<td style="border: 1px solid black;padding-left: 10px;" >
|
730
|
-
(
|
731
|
+
(0006)
|
731
732
|
</td>
|
732
733
|
<td style="border: 1px solid black;padding-left: 10px;" >
|
733
734
|
<span style="font-weight: bold;" >
|
@@ -764,4 +765,46 @@ Alexandre Moutot
|
|
764
765
|
/ a.moutot@alphalink.fr
|
765
766
|
</td>
|
766
767
|
</tr>
|
768
|
+
<tr>
|
769
|
+
<td style="border: 1px solid black;padding-left: 10px;" >
|
770
|
+
2016-10-25
|
771
|
+
</td>
|
772
|
+
<td style="border: 1px solid black;padding-left: 10px;" >
|
773
|
+
(0001)
|
774
|
+
</td>
|
775
|
+
<td style="border: 1px solid black;padding-left: 10px;" >
|
776
|
+
<span style="font-weight: bold;" >
|
777
|
+
Raducu Deaconu
|
778
|
+
</span>
|
779
|
+
/ raducu.deaconu@visma.com
|
780
|
+
</td>
|
781
|
+
</tr>
|
782
|
+
<tr>
|
783
|
+
<td style="border: 1px solid black;padding-left: 10px;" >
|
784
|
+
2017-03-23
|
785
|
+
</td>
|
786
|
+
<td style="border: 1px solid black;padding-left: 10px;" >
|
787
|
+
(0001)
|
788
|
+
</td>
|
789
|
+
<td style="border: 1px solid black;padding-left: 10px;" >
|
790
|
+
<span style="font-weight: bold;" >
|
791
|
+
Steve Traylen
|
792
|
+
</span>
|
793
|
+
/ steve.traylen@cern.ch
|
794
|
+
</td>
|
795
|
+
</tr>
|
796
|
+
<tr>
|
797
|
+
<td style="border: 1px solid black;padding-left: 10px;" >
|
798
|
+
2017-06-01
|
799
|
+
</td>
|
800
|
+
<td style="border: 1px solid black;padding-left: 10px;" >
|
801
|
+
(0001)
|
802
|
+
</td>
|
803
|
+
<td style="border: 1px solid black;padding-left: 10px;" >
|
804
|
+
<span style="font-weight: bold;" >
|
805
|
+
Michael Smith
|
806
|
+
</span>
|
807
|
+
/ michael.smith@puppet.com
|
808
|
+
</td>
|
809
|
+
</tr>
|
767
810
|
</table>
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'logger' # use the standard Ruby logger .....
|
4
|
+
#
|
5
|
+
class Slogger
|
6
|
+
|
7
|
+
# Initialize a new callback logger instance.
|
8
|
+
def initialize(init_parms = nil)
|
9
|
+
_init
|
10
|
+
@log.info("Logger initialization complete.")
|
11
|
+
end
|
12
|
+
|
13
|
+
def _init
|
14
|
+
@log = Logger::new(STDERR) # User preference
|
15
|
+
@log.level = Logger::DEBUG # User preference
|
16
|
+
end
|
17
|
+
|
18
|
+
# Log connecting events
|
19
|
+
def on_connecting(parms)
|
20
|
+
begin
|
21
|
+
@log.debug "Connecting: #{parms}"
|
22
|
+
rescue Exception => ex
|
23
|
+
@log.debug "Connecting oops"
|
24
|
+
print ex.backtrace.join("\n")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Log connected events
|
29
|
+
def on_connected(parms)
|
30
|
+
begin
|
31
|
+
@log.debug "Connected: #{parms}"
|
32
|
+
rescue Exception => ex
|
33
|
+
@log.debug "Connected oops"
|
34
|
+
print ex.backtrace.join("\n")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
end # of class
|
41
|
+
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
#
|
3
|
+
require 'stomp'
|
4
|
+
#
|
5
|
+
class CliWaiter
|
6
|
+
|
7
|
+
@@retry_num = 0
|
8
|
+
@@max_retries = 3
|
9
|
+
|
10
|
+
# Initialize.
|
11
|
+
def initialize # Change the following as needed.
|
12
|
+
@gem_retries = false
|
13
|
+
@host = ENV['STOMP_HOST'] ? ENV['STOMP_HOST'] : "localhost"
|
14
|
+
@port = ENV['STOMP_PORT'] ? ENV['STOMP_PORT'].to_i : 31613 # Artemis here
|
15
|
+
@slt = 75
|
16
|
+
@ver = ENV['STOMP_PROTOCOL'] ? ENV['STOMP_PROTOCOL'] : "1.2"
|
17
|
+
@hbdata = ENV['STOMP_HEARTBEATS'] ? ENV['STOMP_HEARTBEATS'] : "0,0"
|
18
|
+
@conn_hdrs = {"accept-version" => @ver, # version
|
19
|
+
"host" => "localhost", # vhost
|
20
|
+
"heart-beat" => @hbdata, # heartbeats
|
21
|
+
}
|
22
|
+
@hash = { :hosts => [
|
23
|
+
{:login => 'guest', :passcode => 'guest', :host => @host, :port => @port},
|
24
|
+
],
|
25
|
+
:reliable => @gem_retries, # reliable controls retries by the gem
|
26
|
+
:autoflush => true,
|
27
|
+
:connect_headers => @conn_hdrs,
|
28
|
+
}
|
29
|
+
p [ "DB1", @hash ]
|
30
|
+
@do_retry=true # Retry ourself, gem code will not because of :reliable =>
|
31
|
+
end
|
32
|
+
# Run example.
|
33
|
+
def run
|
34
|
+
begin
|
35
|
+
@@retry_num += 1
|
36
|
+
puts "Try Number: #{@@retry_num}"
|
37
|
+
puts "Connect host: #{@host}, port: #{@port}"
|
38
|
+
puts "Connect hash: #{@hash.inspect}"
|
39
|
+
#
|
40
|
+
puts "CliWaiter Starts"
|
41
|
+
c = Stomp::Client.new(@hash)
|
42
|
+
#
|
43
|
+
puts "CliWaiter Sleeps: #{@slt} seconds"
|
44
|
+
sleep @slt
|
45
|
+
#
|
46
|
+
c.close
|
47
|
+
puts "CliWaiter Ends"
|
48
|
+
rescue Exception => ex
|
49
|
+
puts "Kaboom, we are in trouble"
|
50
|
+
puts "Exception Message: #{ex.message}"
|
51
|
+
puts "Exception Class: #{ex.class}"
|
52
|
+
puts "The gory details:"
|
53
|
+
print ex.backtrace.join("\n")
|
54
|
+
if @do_retry && @@retry_num < @@max_retries
|
55
|
+
retry
|
56
|
+
else
|
57
|
+
raise
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
#
|
63
|
+
|
64
|
+
#
|
65
|
+
e = CliWaiter.new
|
66
|
+
e.run
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
#
|
3
|
+
require 'stomp'
|
4
|
+
#
|
5
|
+
if Kernel.respond_to?(:require_relative)
|
6
|
+
require_relative("artlogger")
|
7
|
+
else
|
8
|
+
$LOAD_PATH << File.dirname(__FILE__)
|
9
|
+
require "artlogger"
|
10
|
+
end
|
11
|
+
#
|
12
|
+
class CliWaiter
|
13
|
+
|
14
|
+
# Initialize.
|
15
|
+
def initialize # Change the following as needed.
|
16
|
+
#
|
17
|
+
mylog = Slogger::new # a stomp callback logger
|
18
|
+
#
|
19
|
+
@gem_retries = true
|
20
|
+
@host = ENV['STOMP_HOST'] ? ENV['STOMP_HOST'] : "localhost"
|
21
|
+
@port = ENV['STOMP_PORT'] ? ENV['STOMP_PORT'].to_i : 31613 # Artemis here
|
22
|
+
@slt = 75
|
23
|
+
@ver = ENV['STOMP_PROTOCOL'] ? ENV['STOMP_PROTOCOL'] : "1.2"
|
24
|
+
@hbdata = ENV['STOMP_HEARTBEATS'] ? ENV['STOMP_HEARTBEATS'] : "0,0"
|
25
|
+
@conn_hdrs = {"accept-version" => @ver, # version
|
26
|
+
"host" => "localhost", # vhost
|
27
|
+
"heart-beat" => @hbdata, # heartbeats
|
28
|
+
}
|
29
|
+
@hash = { :hosts => [
|
30
|
+
{:login => 'guest', :passcode => 'guest', :host => @host, :port => @port},
|
31
|
+
],
|
32
|
+
:reliable => @gem_retries, # reliable controls retries by the gem
|
33
|
+
:logger => mylog, # This enables callback logging!
|
34
|
+
:autoflush => true,
|
35
|
+
:connect_headers => @conn_hdrs,
|
36
|
+
:initial_reconnect_delay => 1.0, # initial delay before reconnect (secs)
|
37
|
+
:use_exponential_back_off => false, # don't backoff
|
38
|
+
:max_reconnect_attempts => 3, # retry 3 times
|
39
|
+
}
|
40
|
+
end
|
41
|
+
# Run example.
|
42
|
+
def run
|
43
|
+
puts "Connect host: #{@host}, port: #{@port}"
|
44
|
+
puts "Connect hash: #{@hash}"
|
45
|
+
#
|
46
|
+
puts "CliWaiter Starts"
|
47
|
+
c = Stomp::Client.new(@hash)
|
48
|
+
#
|
49
|
+
while true
|
50
|
+
puts "CliWaiter Sleeps: #{@slt} seconds"
|
51
|
+
sleep @slt
|
52
|
+
end
|
53
|
+
#
|
54
|
+
c.close
|
55
|
+
end
|
56
|
+
end
|
57
|
+
#
|
58
|
+
|
59
|
+
#
|
60
|
+
e = CliWaiter.new
|
61
|
+
e.run
|
data/examples/contrib.sh
CHANGED
data/examples/examplogger.rb
CHANGED
@@ -102,9 +102,11 @@ class Slogger
|
|
102
102
|
@log.debug "Connect Fail oops"
|
103
103
|
end
|
104
104
|
=begin
|
105
|
-
|
106
|
-
|
107
|
-
|
105
|
+
rescue
|
106
|
+
# An example LoggerConnectionError raise
|
107
|
+
@log.debug "Connect Fail, will raise"
|
108
|
+
raise Stomp::Error::LoggerConnectionError.new("quit from connect fail")
|
109
|
+
end
|
108
110
|
=end
|
109
111
|
end
|
110
112
|
|
data/examples/ssl_uc1.rb
CHANGED
@@ -33,7 +33,10 @@ class ExampleSSL1
|
|
33
33
|
# Run example.
|
34
34
|
def run
|
35
35
|
puts "Connect host: #{@host}, port: #{@port}"
|
36
|
-
|
36
|
+
|
37
|
+
ssl_opts = Stomp::SSLParams.new # or ssl_opts = true (for this use case)
|
38
|
+
#### ssl_opts = false # for testing HandShakeDetectedError exception
|
39
|
+
|
37
40
|
hash = { :hosts => [
|
38
41
|
{:login => 'guest', :passcode => 'guest', :host => @host, :port => @port, :ssl => ssl_opts},
|
39
42
|
],
|
@@ -52,4 +55,3 @@ end
|
|
52
55
|
#
|
53
56
|
e = ExampleSSL1.new
|
54
57
|
e.run
|
55
|
-
|
data/lib/client/utils.rb
CHANGED
@@ -25,12 +25,15 @@ module Stomp
|
|
25
25
|
url = regexp.match(login)
|
26
26
|
$VERBOSE = original_verbose
|
27
27
|
return false unless url
|
28
|
-
|
28
|
+
@login = url[3] || ""
|
29
|
+
@passcode = url[4] || ""
|
30
|
+
@host = url[5]
|
31
|
+
@port = url[6].to_i
|
29
32
|
@parameters = { :reliable => false,
|
30
|
-
:hosts => [ { :login =>
|
31
|
-
:passcode =>
|
32
|
-
:host =>
|
33
|
-
:port =>
|
33
|
+
:hosts => [ { :login => @login,
|
34
|
+
:passcode => @passcode,
|
35
|
+
:host => @host,
|
36
|
+
:port => @port} ] }
|
34
37
|
true
|
35
38
|
end
|
36
39
|
|
@@ -78,6 +81,7 @@ module Stomp
|
|
78
81
|
def build_subscription_id(destination, headers)
|
79
82
|
return headers[:id] until headers[:id].nil?
|
80
83
|
return headers['id'] until headers['id'].nil?
|
84
|
+
# p [ "DBBSID1", destination, headers ]
|
81
85
|
Digest::SHA1.hexdigest(destination)
|
82
86
|
end
|
83
87
|
|
@@ -106,7 +110,7 @@ module Stomp
|
|
106
110
|
@parameters[:hosts].each do |hv|
|
107
111
|
# Validate port requested
|
108
112
|
raise ArgumentError.new("empty :port value in #{hv.inspect}") if hv[:port] == ''
|
109
|
-
unless hv[:port].nil?
|
113
|
+
unless hv[:port].nil?
|
110
114
|
tpv = hv[:port].to_i
|
111
115
|
raise ArgumentError.new("invalid :port value=#{tpv} from #{hv.inspect}") if tpv < 1 || tpv > 65535
|
112
116
|
end
|
@@ -204,4 +208,3 @@ module Stomp
|
|
204
208
|
end # class Client
|
205
209
|
|
206
210
|
end # module Stomp
|
207
|
-
|
@@ -107,9 +107,9 @@ module Stomp
|
|
107
107
|
compval = (@hbsend_interval - (@hbsend_interval/5.0)) / 1000000.0
|
108
108
|
if delta > compval || first_time
|
109
109
|
first_time = false
|
110
|
-
slog(:on_hbfire, log_params, "send_heartbeat", :last_sleep => slt,
|
110
|
+
slog(:on_hbfire, log_params, "send_heartbeat", {:last_sleep => slt,
|
111
111
|
:curt => curt, :last_send => @ls, :delta => delta,
|
112
|
-
:compval => compval)
|
112
|
+
:compval => compval})
|
113
113
|
# Send a heartbeat
|
114
114
|
@transmit_semaphore.synchronize do
|
115
115
|
begin
|
@@ -194,7 +194,8 @@ module Stomp
|
|
194
194
|
slog(:on_hbread_fail, log_params, {"ticker_interval" => sleeptime,
|
195
195
|
"read_fail_count" => read_fail_count,
|
196
196
|
"lock_fail" => false,
|
197
|
-
"lock_fail_count" => lock_fail_count
|
197
|
+
"lock_fail_count" => lock_fail_count,
|
198
|
+
"fail_point" => "not_ready"})
|
198
199
|
end
|
199
200
|
else # try_lock failed
|
200
201
|
# Shrug. Could not get lock. Client must be actually be reading.
|
@@ -204,7 +205,8 @@ module Stomp
|
|
204
205
|
slog(:on_hbread_fail, log_params, {"ticker_interval" => sleeptime,
|
205
206
|
"read_fail_count" => read_fail_count,
|
206
207
|
"lock_fail" => true,
|
207
|
-
"lock_fail_count" => lock_fail_count
|
208
|
+
"lock_fail_count" => lock_fail_count,
|
209
|
+
"fail_point" => "try_lock_fail"})
|
208
210
|
end # of the try_lock
|
209
211
|
|
210
212
|
else # delta <= sleeptime
|
@@ -216,7 +218,8 @@ module Stomp
|
|
216
218
|
slog(:on_hbread_fail, log_params, {"ticker_interval" => sleeptime,
|
217
219
|
"exception" => recvex,
|
218
220
|
"read_fail_count" => read_fail_count,
|
219
|
-
"lock_fail_count" => lock_fail_count
|
221
|
+
"lock_fail_count" => lock_fail_count,
|
222
|
+
"fail_point" => "receive_exception"})
|
220
223
|
fail_hard = true
|
221
224
|
end
|
222
225
|
# Do we want to attempt a retry?
|
@@ -227,17 +230,17 @@ module Stomp
|
|
227
230
|
# This is an attempt at a connection retry.
|
228
231
|
@st.kill if @st # Kill the sender thread if one exists
|
229
232
|
_reconn_prep_hb() # Drive reconnection logic
|
230
|
-
Thread.exit # This receiver thread is done
|
233
|
+
Thread.exit # This receiver thread is done
|
231
234
|
end
|
232
235
|
# Retry on max lock fails. Different logic in order to avoid a deadlock.
|
233
236
|
if (@max_hbrlck_fails > 0 && lock_fail_count >= @max_hbrlck_fails)
|
234
237
|
# This is an attempt at a connection retry.
|
235
|
-
|
236
|
-
@
|
237
|
-
|
238
|
+
@gets_semaphore.synchronize do
|
239
|
+
@getst.raise(Errno::EBADF.new) if @getst # kill the socket reading thread if exists
|
240
|
+
@socket.close rescue nil # Attempt a forced close
|
238
241
|
end
|
239
242
|
@st.kill if @st # Kill the sender thread if one exists
|
240
|
-
Thread.exit # This receiver thread is done
|
243
|
+
Thread.exit # This receiver thread is done
|
241
244
|
end
|
242
245
|
end
|
243
246
|
Thread.pass # Prior to next receive loop
|
@@ -259,4 +262,3 @@ module Stomp
|
|
259
262
|
end # class Connection
|
260
263
|
|
261
264
|
end # module Stomp
|
262
|
-
|
data/lib/connection/netio.rb
CHANGED
@@ -9,6 +9,17 @@ module Stomp
|
|
9
9
|
|
10
10
|
class Connection
|
11
11
|
|
12
|
+
def _interruptible_gets(read_socket)
|
13
|
+
# The gets thread may be interrupted by the heartbeat thread. Ensure that
|
14
|
+
# if so interrupted, a new gets cannot start until after the heartbeat
|
15
|
+
# thread finishes its work. This is PURELY to avoid a segfault bug
|
16
|
+
# involving OpenSSL::Buffer.
|
17
|
+
@gets_semaphore.synchronize { @getst = Thread.current }
|
18
|
+
read_socket.gets
|
19
|
+
ensure
|
20
|
+
@gets_semaphore.synchronize { @getst = nil }
|
21
|
+
end
|
22
|
+
|
12
23
|
private
|
13
24
|
|
14
25
|
# Really read from the wire.
|
@@ -40,6 +51,9 @@ module Stomp
|
|
40
51
|
return nil if line.nil?
|
41
52
|
#An extra \n at the beginning of the frame, possibly not caught by is_ready?
|
42
53
|
line = '' if line == "\n"
|
54
|
+
if line == HAND_SHAKE_DATA
|
55
|
+
raise Stomp::Error::HandShakeDetectedError
|
56
|
+
end
|
43
57
|
p [ "wiredatain_01A", line, Time.now ] if drdbg
|
44
58
|
line = _normalize_line_end(line) if @protocol >= Stomp::SPL_12
|
45
59
|
p [ "wiredatain_01B", line, Time.now ] if drdbg
|
@@ -48,11 +62,11 @@ module Stomp
|
|
48
62
|
begin
|
49
63
|
message_header += line
|
50
64
|
p [ "wiredatain_02A", line, Time.now ] if drdbg
|
51
|
-
unless connread
|
65
|
+
unless connread || @ssl
|
52
66
|
raise Stomp::Error::ReceiveTimeout unless IO.select([read_socket], nil, nil, @iosto)
|
53
67
|
end
|
54
68
|
p [ "wiredatain_02B", line, Time.now ] if drdbg
|
55
|
-
line = read_socket
|
69
|
+
line = _interruptible_gets(read_socket)
|
56
70
|
p [ "wiredatain_02C", line ] if drdbg
|
57
71
|
raise if line.nil?
|
58
72
|
line = _normalize_line_end(line) if @protocol >= Stomp::SPL_12
|
@@ -66,18 +80,18 @@ module Stomp
|
|
66
80
|
p [ "wiredatain_03B", content_length ] if drdbg
|
67
81
|
# If content_length is present, read the specified amount of bytes
|
68
82
|
if content_length
|
69
|
-
unless connread
|
83
|
+
unless connread || @ssl
|
70
84
|
raise Stomp::Error::ReceiveTimeout unless IO.select([read_socket], nil, nil, @iosto)
|
71
85
|
end
|
72
86
|
p [ "CL01" ] if drdbg
|
73
87
|
message_body = read_socket.read content_length[1].to_i
|
74
|
-
unless connread
|
88
|
+
unless connread || @ssl
|
75
89
|
raise Stomp::Error::ReceiveTimeout unless IO.select([read_socket], nil, nil, @iosto)
|
76
90
|
end
|
77
91
|
raise Stomp::Error::InvalidMessageLength unless parse_char(read_socket.getc) == "\0"
|
78
92
|
# Else read the rest of the message until the first \0
|
79
93
|
else
|
80
|
-
unless connread
|
94
|
+
unless connread || @ssl
|
81
95
|
raise Stomp::Error::ReceiveTimeout unless IO.select([read_socket], nil, nil, @iosto)
|
82
96
|
end
|
83
97
|
p [ "NOCL01" ] if drdbg
|
@@ -99,7 +113,7 @@ module Stomp
|
|
99
113
|
# asynchronous nature of the 'poll' method.
|
100
114
|
p [ "wiredatain_05_prep", "isr", _is_ready?(read_socket) ] if drdbg
|
101
115
|
while _is_ready?(read_socket)
|
102
|
-
unless connread
|
116
|
+
unless connread || @ssl
|
103
117
|
raise Stomp::Error::ReceiveTimeout unless IO.select([read_socket], nil, nil, @iosto)
|
104
118
|
end
|
105
119
|
p [ "WHIR01" ] if drdbg
|
@@ -162,7 +176,7 @@ module Stomp
|
|
162
176
|
# transmit logically puts a Message on the wire.
|
163
177
|
def transmit(command, headers = {}, body = '')
|
164
178
|
# The transmit may fail so we may need to retry.
|
165
|
-
while
|
179
|
+
while true
|
166
180
|
begin
|
167
181
|
used_socket = socket()
|
168
182
|
_transmit(used_socket, command, headers, body)
|
@@ -207,7 +221,7 @@ module Stomp
|
|
207
221
|
# For more information refer to http://juretta.com/log/2009/05/24/activemq-jms-stomp/
|
208
222
|
# Lets send this header in the message, so it can maintain state when using unreceive
|
209
223
|
headers[:'content-length'] = "#{body_length_bytes}" unless headers[:suppress_content_length]
|
210
|
-
headers[:'content-type'] = "text/plain; charset=UTF-8" unless headers[:'content-type']
|
224
|
+
headers[:'content-type'] = "text/plain; charset=UTF-8" unless headers[:'content-type'] || headers[:suppress_content_type]
|
211
225
|
_wire_write(used_socket,command)
|
212
226
|
headers.each do |k,v|
|
213
227
|
if v.is_a?(Array)
|
@@ -219,7 +233,17 @@ module Stomp
|
|
219
233
|
end
|
220
234
|
end
|
221
235
|
_wire_write(used_socket,"")
|
222
|
-
|
236
|
+
if body != ''
|
237
|
+
if headers[:suppress_content_length]
|
238
|
+
if tz = body.index("\00")
|
239
|
+
used_socket.write body[0..tz-1]
|
240
|
+
else
|
241
|
+
used_socket.write body
|
242
|
+
end
|
243
|
+
else
|
244
|
+
used_socket.write body
|
245
|
+
end
|
246
|
+
end
|
223
247
|
used_socket.write "\0"
|
224
248
|
used_socket.flush if autoflush
|
225
249
|
|
@@ -332,7 +356,7 @@ module Stomp
|
|
332
356
|
# Set SSLContext Options if user asks for it in Stomp::SSLParams
|
333
357
|
# and SSL supports it.
|
334
358
|
if @ssl.ssl_ctxopts && ctx.respond_to?(:options=)
|
335
|
-
|
359
|
+
ctx.options = @ssl.ssl_ctxopts
|
336
360
|
end
|
337
361
|
|
338
362
|
end
|
@@ -449,24 +473,24 @@ module Stomp
|
|
449
473
|
if RUBY_VERSION < "2"
|
450
474
|
while true
|
451
475
|
### p [ "ilrjr01A1", _is_ready?(read_socket) ]
|
452
|
-
line = read_socket
|
476
|
+
line = _interruptible_gets(read_socket) # Data from wire
|
453
477
|
break unless line == "\n"
|
454
478
|
line = ''
|
455
479
|
end
|
456
480
|
else # RUBY_VERSION >= "2"
|
457
481
|
while _is_ready?(read_socket)
|
458
482
|
### p [ "ilrjr01B2", _is_ready?(read_socket) ]
|
459
|
-
line = read_socket
|
483
|
+
line = _interruptible_gets(read_socket) # Data from wire
|
460
484
|
break unless line == "\n"
|
461
485
|
line = ''
|
462
486
|
end
|
463
487
|
end
|
464
488
|
else
|
465
|
-
line = read_socket
|
489
|
+
line = _interruptible_gets(read_socket) # The old way
|
466
490
|
end
|
467
491
|
else # We are >= 1.1 *AND* receiving heartbeats.
|
468
492
|
while true
|
469
|
-
line = read_socket
|
493
|
+
line = _interruptible_gets(read_socket) # Data from wire
|
470
494
|
break unless line == "\n"
|
471
495
|
line = ''
|
472
496
|
@lr = Time.now.to_f
|
@@ -490,6 +514,15 @@ module Stomp
|
|
490
514
|
end
|
491
515
|
end # _dump_callstack
|
492
516
|
|
517
|
+
# used for debugging
|
518
|
+
def _dump_threads()
|
519
|
+
tl = Thread::list
|
520
|
+
tl.each do |at|
|
521
|
+
p [ "THDMPN", at ]
|
522
|
+
end
|
523
|
+
p [ "THDMPMain", @parameters[:client_main] ]
|
524
|
+
end
|
525
|
+
|
493
526
|
end # class Connection
|
494
527
|
|
495
528
|
end # module Stomp
|