stomp 1.4.8 → 1.4.9
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -0
- data/README.md +95 -64
- data/examples/conn_get.rb +122 -0
- data/examples/conn_put.rb +111 -0
- data/examples/conn_put_pace.rb +117 -0
- data/examples/conn_putget.rb +8 -1
- data/examples/examplogger.rb +33 -11
- data/examples/logexamp.rb +3 -0
- data/examples/putget_file.rb +2 -2
- data/examples/stomp_common.rb +1 -0
- data/lib/client/utils.rb +1 -0
- data/lib/connection/netio.rb +53 -16
- data/lib/connection/utils.rb +1 -0
- data/lib/stomp/connection.rb +1 -0
- data/lib/stomp/version.rb +1 -1
- data/stomp.gemspec +6 -3
- data/test/test_anonymous.rb +3 -1
- data/test/test_connection.rb +6 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: af4124fc6712cdcd80e4f8c750e2be5cc4cd3f2dbb99c3d7b557bc14148a9a13
|
4
|
+
data.tar.gz: 18afb85efecbf3126909b419365d3f5c45360e8a5a9ddaaac4f43d69bef40aaf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9fe7ee0a04e5fd4de9a2d4cde550d9cb2def32dc01d559a6daf2b4cb65d4135ae8089c905e9cfeee73d4e807da4cf860eb0401399b4348b507dce0b76523cfb0
|
7
|
+
data.tar.gz: 0c252981d37ab724868eb032b68f8892f149dd669f38460a5f256ec7cf4b1bbf6e9c67090c0840611cdc22daaceaf97cd021189bef45a3da057c6febd44cfb35
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
# Stomp Gem Change Log
|
2
2
|
|
3
|
+
## 1.4.9 20191116
|
4
|
+
|
5
|
+
* More debugging messages in netio.rb.
|
6
|
+
* Test workaround for Artemis-2289.
|
7
|
+
* New put and get examples.
|
8
|
+
* Fix issue #160.
|
9
|
+
* Address issue #155.
|
10
|
+
* Suppress SSL stacktrace to stdout.
|
11
|
+
* Example logger enhancements.
|
12
|
+
* Optional STOMP frame in examples.
|
13
|
+
|
3
14
|
## 1.4.8 20181219
|
4
15
|
|
5
16
|
* Fix missed merge from 1.4.7 release.
|
data/README.md
CHANGED
@@ -6,94 +6,97 @@
|
|
6
6
|
|
7
7
|
An implementation of the Stomp protocol for Ruby. See:
|
8
8
|
|
9
|
-
* [STOMP 1.0
|
9
|
+
* [STOMP 1.0](http://stomp.github.io/stomp-specification-1.0.html)
|
10
|
+
* [STOMP 1.1](http://stomp.github.io/stomp-specification-1.1.html)
|
11
|
+
* [STOMP 1.2](http://stomp.github.io/stomp-specification-1.2.html)
|
10
12
|
|
11
13
|
## Hash Login Example Usage (**this is the recommended login technique**):
|
12
14
|
|
13
|
-
```
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
15
|
+
```ruby
|
16
|
+
hash = {
|
17
|
+
hosts: [
|
18
|
+
# First connect is to remotehost1
|
19
|
+
{ login: 'login1', passcode: 'passcode1', host: 'remotehost1', port: 61_612, ssl: true },
|
20
|
+
# First failover connect is to remotehost2
|
21
|
+
{ login: 'login2', passcode: 'passcode2', host: 'remotehost2', port: 61_613, ssl: false }
|
22
|
+
],
|
23
|
+
# These are the default parameters and do not need to be set
|
24
|
+
reliable: true, # reliable (use failover)
|
25
|
+
initial_reconnect_delay: 0.01, # initial delay before reconnect (secs)
|
26
|
+
max_reconnect_delay: 30.0, # max delay before reconnect
|
27
|
+
use_exponential_back_off: true, # increase delay between reconnect attpempts
|
28
|
+
back_off_multiplier: 2, # next delay multiplier
|
29
|
+
max_reconnect_attempts: 0, # retry forever, use # for maximum attempts
|
30
|
+
randomize: false, # do not radomize hosts hash before reconnect
|
31
|
+
connect_timeout: 0, # Timeout for TCP/TLS connects, use # for max seconds
|
32
|
+
connect_headers: {}, # user supplied CONNECT headers (req'd for Stomp 1.1+)
|
33
|
+
parse_timeout: 5, # IO::select wait time on socket reads
|
34
|
+
logger: nil, # user suplied callback logger instance
|
35
|
+
dmh: false, # do not support multihomed IPV4 / IPV6 hosts during failover
|
36
|
+
closed_check: true, # check first if closed in each protocol method
|
37
|
+
hbser: false, # raise on heartbeat send exception
|
38
|
+
stompconn: false, # Use STOMP instead of CONNECT
|
39
|
+
usecrlf: false, # Use CRLF command and header line ends (1.2+)
|
40
|
+
max_hbread_fails: 0, # Max HB read fails before retry. 0 => never retry
|
41
|
+
max_hbrlck_fails: 0, # Max HB read lock obtain fails before retry. 0 => never retry
|
42
|
+
fast_hbs_adjust: 0.0, # Fast heartbeat senders sleep adjustment, seconds, needed ...
|
43
|
+
# For fast heartbeat senders. 'fast' == YMMV. If not
|
44
|
+
# correct for your environment, expect unnecessary fail overs
|
45
|
+
connread_timeout: 0, # Timeout during CONNECT for read of CONNECTED/ERROR, secs
|
46
|
+
tcp_nodelay: true, # Turns on the TCP_NODELAY socket option; disables Nagle's algorithm
|
47
|
+
start_timeout: 0, # Timeout around Stomp::Client initialization
|
48
|
+
sslctx_newparm: nil, # Param for SSLContext.new
|
49
|
+
ssl_post_conn_check: true, # Further verify broker identity
|
50
|
+
nto_cmd_read: true, # No timeout on COMMAND read
|
51
|
+
}
|
50
52
|
|
51
|
-
|
52
|
-
|
53
|
+
# for a client
|
54
|
+
client = Stomp::Client.new(hash)
|
53
55
|
|
54
|
-
|
55
|
-
|
56
|
+
# for a connection
|
57
|
+
connection = Stomp::Connection.new(hash)
|
56
58
|
```
|
57
59
|
|
58
60
|
### Positional Parameter Usage:
|
59
61
|
|
60
|
-
```
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
62
|
+
```ruby
|
63
|
+
client = Stomp::Client.new("user", "pass", "localhost", 61613)
|
64
|
+
client.publish("/queue/mine", "hello world!")
|
65
|
+
client.subscribe("/queue/mine") do |msg|
|
66
|
+
p msg
|
67
|
+
end
|
66
68
|
```
|
67
69
|
|
68
70
|
### Stomp URL Usage:
|
69
71
|
|
70
|
-
A Stomp URL must begin with
|
72
|
+
A Stomp URL must begin with `stomp://` and can be in one of the following forms:
|
71
73
|
|
72
74
|
```
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
75
|
+
stomp://host:port
|
76
|
+
stomp://host.domain.tld:port
|
77
|
+
stomp://login:passcode@host:port
|
78
|
+
stomp://login:passcode@host.domain.tld:port
|
79
|
+
|
80
|
+
# e.g. c = Stomp::Client.new(urlstring)
|
79
81
|
```
|
80
82
|
|
81
83
|
### Failover + SSL Example URL Usage:
|
82
84
|
|
83
|
-
```
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
85
|
+
```ruby
|
86
|
+
options = 'initialReconnectDelay=5000&randomize=false&useExponentialBackOff=false'
|
87
|
+
# remotehost1 uses SSL, remotehost2 doesn't
|
88
|
+
client = Stomp::Client.new("failover:(stomp+ssl://login1:passcode1@remotehost1:61612,stomp://login2:passcode2@remotehost2:61613)?#{options}")
|
89
|
+
client.publish('/queue/mine', 'hello world!')
|
90
|
+
client.subscribe('/queue/mine') do |msg|
|
91
|
+
p msg
|
92
|
+
end
|
91
93
|
```
|
92
94
|
|
93
95
|
### New:
|
94
96
|
|
95
97
|
See _CHANGELOG.rdoc_ for details.
|
96
98
|
|
99
|
+
* Gem version 1.4.9. Fix two issues, enhance debugging and examples.
|
97
100
|
* Gem version 1.4.8. Fix missed merge in 1.4.7 release.
|
98
101
|
* Gem version 1.4.7. Add support for text SSL certs. Do not use, use 1.4.8 instead.
|
99
102
|
* Gem version 1.4.6. Fix version 1.4.5 which breaks JRuby support.
|
@@ -322,7 +325,7 @@ Rafael Rosa
|
|
322
325
|
2010-03-23
|
323
326
|
</td>
|
324
327
|
<td style="border: 1px solid black;padding-left: 10px;" >
|
325
|
-
(
|
328
|
+
(0106)
|
326
329
|
</td>
|
327
330
|
<td style="border: 1px solid black;padding-left: 10px;" >
|
328
331
|
<span style="font-weight: bold;" >
|
@@ -821,4 +824,32 @@ Katharine
|
|
821
824
|
/ <krsibbald@gmail.com>
|
822
825
|
</td>
|
823
826
|
</tr>
|
827
|
+
<tr>
|
828
|
+
<td style="border: 1px solid black;padding-left: 10px;" >
|
829
|
+
2019-06-05
|
830
|
+
</td>
|
831
|
+
<td style="border: 1px solid black;padding-left: 10px;" >
|
832
|
+
(0001)
|
833
|
+
</td>
|
834
|
+
<td style="border: 1px solid black;padding-left: 10px;" >
|
835
|
+
<span style="font-weight: bold;" >
|
836
|
+
Smit Patel
|
837
|
+
</span>
|
838
|
+
/ <smitpatel24@gmail.com>
|
839
|
+
</td>
|
840
|
+
</tr>
|
841
|
+
<tr>
|
842
|
+
<td style="border: 1px solid black;padding-left: 10px;" >
|
843
|
+
2019-09-16
|
844
|
+
</td>
|
845
|
+
<td style="border: 1px solid black;padding-left: 10px;" >
|
846
|
+
(0001)
|
847
|
+
</td>
|
848
|
+
<td style="border: 1px solid black;padding-left: 10px;" >
|
849
|
+
<span style="font-weight: bold;" >
|
850
|
+
Thiago Xavier
|
851
|
+
</span>
|
852
|
+
/ <thiagoxvo@gmail.com>
|
853
|
+
</td>
|
854
|
+
</tr>
|
824
855
|
</table>
|
@@ -0,0 +1,122 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
#
|
4
|
+
# The current require dance for different Ruby versions.
|
5
|
+
# Change this to suit your requirements.
|
6
|
+
#
|
7
|
+
if Kernel.respond_to?(:require_relative)
|
8
|
+
require_relative("./stomp_common")
|
9
|
+
else
|
10
|
+
$LOAD_PATH << File.dirname(__FILE__)
|
11
|
+
require "stomp_common"
|
12
|
+
end
|
13
|
+
include Stomp1xCommon
|
14
|
+
|
15
|
+
#
|
16
|
+
# == Stomp 1.x Putt / Get Example
|
17
|
+
#
|
18
|
+
# Purpose: to demonstrate producing and consuming messages using a
|
19
|
+
# Stomp#Connection instance.
|
20
|
+
#
|
21
|
+
# Note: this example assumes that you have at least the 1.2.0 gem release
|
22
|
+
# installed.
|
23
|
+
#
|
24
|
+
# When you:
|
25
|
+
#
|
26
|
+
# * Use a Stomp compliant broker
|
27
|
+
# * Want a Stomp 1.1+ connection and functionality
|
28
|
+
#
|
29
|
+
# then your code *must* specifically request that environment.
|
30
|
+
#
|
31
|
+
# You need to supply all of the normal values expected of course:
|
32
|
+
#
|
33
|
+
# * login - the user name
|
34
|
+
# * passcode - the password
|
35
|
+
# * host - the host to connect to
|
36
|
+
# * port - the port to connect to
|
37
|
+
#
|
38
|
+
# Additionaly you are required to supply the 1.1+ connection data as documented
|
39
|
+
# in the Stomp 1.1+ specifications:
|
40
|
+
#
|
41
|
+
# http://stomp.github.com/stomp-specification-1.0.html
|
42
|
+
# http://stomp.github.com/stomp-specification-1.1.html
|
43
|
+
# http://stomp.github.com/stomp-specification-1.2.html
|
44
|
+
#
|
45
|
+
# You are urged to become familiar with the specs. They are short documents.
|
46
|
+
#
|
47
|
+
# This includes:
|
48
|
+
#
|
49
|
+
# * The Stomp version(s) you wish the broker to consider
|
50
|
+
# * The broker vhost to connect to
|
51
|
+
#
|
52
|
+
# You may optionally specify other 1.1+ data:
|
53
|
+
#
|
54
|
+
# * heartbeat request
|
55
|
+
#
|
56
|
+
# Using the stomp gem, you should specify this data in the "connect_headers" Hash
|
57
|
+
# parameter. This example uses the common get_connection() method to
|
58
|
+
# get a connection.
|
59
|
+
#
|
60
|
+
class ConnectionGetExample
|
61
|
+
# Initialize
|
62
|
+
def initialize
|
63
|
+
end
|
64
|
+
# Run example
|
65
|
+
def run
|
66
|
+
#
|
67
|
+
# Get a connection
|
68
|
+
# ================
|
69
|
+
#
|
70
|
+
conn = get_connection()
|
71
|
+
#
|
72
|
+
# Let's just do some sanity checks, and look around.
|
73
|
+
#
|
74
|
+
raise "Connection failed!!" unless conn.open?()
|
75
|
+
#
|
76
|
+
# The broker _could_ have returned an ERROR frame (unlikely).
|
77
|
+
#
|
78
|
+
raise "Connect error: #{conn.connection_frame.body}" if conn.connection_frame.command == Stomp::CMD_ERROR
|
79
|
+
#
|
80
|
+
puts "Connection complete."
|
81
|
+
#
|
82
|
+
# Get Destination
|
83
|
+
#
|
84
|
+
qname = dest()
|
85
|
+
nm = nmsgs()
|
86
|
+
puts
|
87
|
+
puts "Connection start receives"
|
88
|
+
#
|
89
|
+
# Receives
|
90
|
+
#
|
91
|
+
# Subscribe
|
92
|
+
#
|
93
|
+
uuid = conn.uuid() # uuid for Stomp::Connection is a public method
|
94
|
+
conn.subscribe(qname, {'id' => uuid}) # Subscribe
|
95
|
+
#
|
96
|
+
# Run gets
|
97
|
+
#
|
98
|
+
received = ""
|
99
|
+
1.upto(nm) do
|
100
|
+
received = conn.receive()
|
101
|
+
puts "Received headers: #{received.headers}"
|
102
|
+
puts "Received body: #{received.body}"
|
103
|
+
end
|
104
|
+
puts
|
105
|
+
received.headers.each do |h|
|
106
|
+
puts h
|
107
|
+
end
|
108
|
+
#
|
109
|
+
# And be polite, unsubscribe.
|
110
|
+
#
|
111
|
+
conn.unsubscribe(qname, {'id' => uuid})
|
112
|
+
#
|
113
|
+
# Finally disconnect
|
114
|
+
# ==================
|
115
|
+
#
|
116
|
+
conn.disconnect() # Business as usual
|
117
|
+
puts "\nConnection disconnect complete"
|
118
|
+
end
|
119
|
+
end
|
120
|
+
#
|
121
|
+
e = ConnectionGetExample.new()
|
122
|
+
e.run
|
@@ -0,0 +1,111 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
#
|
4
|
+
# The current require dance for different Ruby versions.
|
5
|
+
# Change this to suit your requirements.
|
6
|
+
#
|
7
|
+
if Kernel.respond_to?(:require_relative)
|
8
|
+
require_relative("./stomp_common")
|
9
|
+
else
|
10
|
+
$LOAD_PATH << File.dirname(__FILE__)
|
11
|
+
require "stomp_common"
|
12
|
+
end
|
13
|
+
include Stomp1xCommon
|
14
|
+
|
15
|
+
#
|
16
|
+
# == Stomp 1.x Putt / Get Example
|
17
|
+
#
|
18
|
+
# Purpose: to demonstrate producing and consuming messages using a
|
19
|
+
# Stomp#Connection instance.
|
20
|
+
#
|
21
|
+
# Note: this example assumes that you have at least the 1.2.0 gem release
|
22
|
+
# installed.
|
23
|
+
#
|
24
|
+
# When you:
|
25
|
+
#
|
26
|
+
# * Use a Stomp compliant broker
|
27
|
+
# * Want a Stomp 1.1+ connection and functionality
|
28
|
+
#
|
29
|
+
# then your code *must* specifically request that environment.
|
30
|
+
#
|
31
|
+
# You need to supply all of the normal values expected of course:
|
32
|
+
#
|
33
|
+
# * login - the user name
|
34
|
+
# * passcode - the password
|
35
|
+
# * host - the host to connect to
|
36
|
+
# * port - the port to connect to
|
37
|
+
#
|
38
|
+
# Additionaly you are required to supply the 1.1+ connection data as documented
|
39
|
+
# in the Stomp 1.1+ specifications:
|
40
|
+
#
|
41
|
+
# http://stomp.github.com/stomp-specification-1.0.html
|
42
|
+
# http://stomp.github.com/stomp-specification-1.1.html
|
43
|
+
# http://stomp.github.com/stomp-specification-1.2.html
|
44
|
+
#
|
45
|
+
# You are urged to become familiar with the specs. They are short documents.
|
46
|
+
#
|
47
|
+
# This includes:
|
48
|
+
#
|
49
|
+
# * The Stomp version(s) you wish the broker to consider
|
50
|
+
# * The broker vhost to connect to
|
51
|
+
#
|
52
|
+
# You may optionally specify other 1.1+ data:
|
53
|
+
#
|
54
|
+
# * heartbeat request
|
55
|
+
#
|
56
|
+
# Using the stomp gem, you should specify this data in the "connect_headers" Hash
|
57
|
+
# parameter. This example uses the common get_connection() method to
|
58
|
+
# get a connection.
|
59
|
+
#
|
60
|
+
class ConnectionPutExample
|
61
|
+
# Initialize
|
62
|
+
def initialize
|
63
|
+
end
|
64
|
+
# Run example
|
65
|
+
def run
|
66
|
+
#
|
67
|
+
# Get a connection
|
68
|
+
# ================
|
69
|
+
#
|
70
|
+
conn = get_connection()
|
71
|
+
#
|
72
|
+
# Let's just do some sanity checks, and look around.
|
73
|
+
#
|
74
|
+
raise "Connection failed!!" unless conn.open?()
|
75
|
+
#
|
76
|
+
# The broker _could_ have returned an ERROR frame (unlikely).
|
77
|
+
#
|
78
|
+
raise "Connect error: #{conn.connection_frame.body}" if conn.connection_frame.command == Stomp::CMD_ERROR
|
79
|
+
#
|
80
|
+
puts "Connection complete."
|
81
|
+
#
|
82
|
+
# Get Destination
|
83
|
+
#
|
84
|
+
qname = dest()
|
85
|
+
#
|
86
|
+
# Publish/put messages
|
87
|
+
#
|
88
|
+
puts "\nConnection start puts"
|
89
|
+
nm = nmsgs()
|
90
|
+
ph = {:persistent => true}
|
91
|
+
ph['suppress_content_length'] = 'yes' if suppresscl()
|
92
|
+
ph['K:A'] = 'V:A'
|
93
|
+
ph['K\B'] = 'V\B'
|
94
|
+
ph['K:C'] = 'V\C'
|
95
|
+
puts "Put Headers: #{ph}"
|
96
|
+
1.upto(nm) do |n|
|
97
|
+
data = "message payload: #{n} #{Time.now.to_f}"
|
98
|
+
conn.publish(qname, data, ph)
|
99
|
+
puts "Sent: #{data}"
|
100
|
+
end
|
101
|
+
#
|
102
|
+
# Finally disconnect
|
103
|
+
# ==================
|
104
|
+
#
|
105
|
+
conn.disconnect() # Business as usual
|
106
|
+
puts "\nConnection disconnect complete"
|
107
|
+
end
|
108
|
+
end
|
109
|
+
#
|
110
|
+
e = ConnectionPutExample.new()
|
111
|
+
e.run
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
#
|
4
|
+
# The current require dance for different Ruby versions.
|
5
|
+
# Change this to suit your requirements.
|
6
|
+
#
|
7
|
+
if Kernel.respond_to?(:require_relative)
|
8
|
+
require_relative("./stomp_common")
|
9
|
+
else
|
10
|
+
$LOAD_PATH << File.dirname(__FILE__)
|
11
|
+
require "stomp_common"
|
12
|
+
end
|
13
|
+
include Stomp1xCommon
|
14
|
+
|
15
|
+
#
|
16
|
+
# == Stomp 1.x Putt / Get Example
|
17
|
+
#
|
18
|
+
# Purpose: to demonstrate producing and consuming messages using a
|
19
|
+
# Stomp#Connection instance.
|
20
|
+
#
|
21
|
+
# Note: this example assumes that you have at least the 1.2.0 gem release
|
22
|
+
# installed.
|
23
|
+
#
|
24
|
+
# When you:
|
25
|
+
#
|
26
|
+
# * Use a Stomp compliant broker
|
27
|
+
# * Want a Stomp 1.1+ connection and functionality
|
28
|
+
#
|
29
|
+
# then your code *must* specifically request that environment.
|
30
|
+
#
|
31
|
+
# You need to supply all of the normal values expected of course:
|
32
|
+
#
|
33
|
+
# * login - the user name
|
34
|
+
# * passcode - the password
|
35
|
+
# * host - the host to connect to
|
36
|
+
# * port - the port to connect to
|
37
|
+
#
|
38
|
+
# Additionaly you are required to supply the 1.1+ connection data as documented
|
39
|
+
# in the Stomp 1.1+ specifications:
|
40
|
+
#
|
41
|
+
# http://stomp.github.com/stomp-specification-1.0.html
|
42
|
+
# http://stomp.github.com/stomp-specification-1.1.html
|
43
|
+
# http://stomp.github.com/stomp-specification-1.2.html
|
44
|
+
#
|
45
|
+
# You are urged to become familiar with the specs. They are short documents.
|
46
|
+
#
|
47
|
+
# This includes:
|
48
|
+
#
|
49
|
+
# * The Stomp version(s) you wish the broker to consider
|
50
|
+
# * The broker vhost to connect to
|
51
|
+
#
|
52
|
+
# You may optionally specify other 1.1+ data:
|
53
|
+
#
|
54
|
+
# * heartbeat request
|
55
|
+
#
|
56
|
+
# Using the stomp gem, you should specify this data in the "connect_headers" Hash
|
57
|
+
# parameter. This example uses the common get_connection() method to
|
58
|
+
# get a connection.
|
59
|
+
#
|
60
|
+
class ConnectionPutExample
|
61
|
+
# Initialize
|
62
|
+
def initialize
|
63
|
+
end
|
64
|
+
# Run example
|
65
|
+
def run
|
66
|
+
#
|
67
|
+
# Get a connection
|
68
|
+
# ================
|
69
|
+
#
|
70
|
+
conn = get_connection()
|
71
|
+
#
|
72
|
+
# Let's just do some sanity checks, and look around.
|
73
|
+
#
|
74
|
+
raise "Connection failed!!" unless conn.open?()
|
75
|
+
#
|
76
|
+
# The broker _could_ have returned an ERROR frame (unlikely).
|
77
|
+
#
|
78
|
+
raise "Connect error: #{conn.connection_frame.body}" if conn.connection_frame.command == Stomp::CMD_ERROR
|
79
|
+
#
|
80
|
+
puts "Connection complete."
|
81
|
+
#
|
82
|
+
# Get Destination
|
83
|
+
#
|
84
|
+
qname = dest()
|
85
|
+
puts "Destination: #{qname}"
|
86
|
+
#
|
87
|
+
# Set Pace Time
|
88
|
+
#
|
89
|
+
pt = ENV['STOMP_PACETIME'] ? ENV['STOMP_PACETIME'].to_f : 15.0
|
90
|
+
puts "Pace Time: #{pt} seconds"
|
91
|
+
#
|
92
|
+
nm = nmsgs()
|
93
|
+
puts "Number of messages: #{nm}"
|
94
|
+
#
|
95
|
+
ph = {:persistent => true}
|
96
|
+
puts "Put Headers: #{ph}"
|
97
|
+
#
|
98
|
+
# Publish/put messages
|
99
|
+
#
|
100
|
+
puts "\nConnection start puts"
|
101
|
+
1.upto(nm) do |n|
|
102
|
+
data = "message payload: #{n} #{Time.now.to_f}"
|
103
|
+
conn.publish(qname, data, ph)
|
104
|
+
puts "Sent: #{data}"
|
105
|
+
sleep pt
|
106
|
+
end
|
107
|
+
#
|
108
|
+
# Finally disconnect
|
109
|
+
# ==================
|
110
|
+
#
|
111
|
+
conn.disconnect() # Business as usual
|
112
|
+
puts "\nConnection disconnect complete"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
#
|
116
|
+
e = ConnectionPutExample.new()
|
117
|
+
e.run
|
data/examples/conn_putget.rb
CHANGED
@@ -87,11 +87,18 @@ class ConnectionPutGetExample
|
|
87
87
|
#
|
88
88
|
puts "\nConnection start puts"
|
89
89
|
nm = nmsgs()
|
90
|
+
ph = {:persistent => true}
|
91
|
+
ph['suppress_content_length'] = 'yes' if suppresscl()
|
92
|
+
puts "Put Headers: #{ph}"
|
90
93
|
1.upto(nm) do |n|
|
91
94
|
data = "message payload: #{n} #{Time.now.to_f}"
|
92
|
-
conn.publish(qname, data)
|
95
|
+
conn.publish(qname, data, ph)
|
93
96
|
puts "Sent: #{data}"
|
94
97
|
end
|
98
|
+
|
99
|
+
#conn.disconnect()
|
100
|
+
#conn = get_connection()
|
101
|
+
|
95
102
|
puts
|
96
103
|
puts "Connection start receives"
|
97
104
|
# Receives
|
data/examples/examplogger.rb
CHANGED
@@ -66,14 +66,7 @@ class Slogger
|
|
66
66
|
def _init
|
67
67
|
@log = Logger::new(STDOUT) # User preference
|
68
68
|
@log.level = Logger::DEBUG # User preference
|
69
|
-
|
70
|
-
|
71
|
-
def marshal_dump
|
72
|
-
[]
|
73
|
-
end
|
74
|
-
|
75
|
-
def marshal_load(array)
|
76
|
-
_init
|
69
|
+
@maxml = 100
|
77
70
|
end
|
78
71
|
|
79
72
|
# Log connecting events
|
@@ -98,6 +91,13 @@ class Slogger
|
|
98
91
|
def on_connectfail(parms)
|
99
92
|
begin
|
100
93
|
@log.debug "Connect Fail #{info(parms)}"
|
94
|
+
@log.debug parms
|
95
|
+
@log.debug "Connect Fail Socket status: #{parms[:openstat]}"
|
96
|
+
if parms[:cur_failure]
|
97
|
+
@log.debug "Connect Fail Error Message: #{parms[:cur_failure].message}"
|
98
|
+
btr = parms[:cur_failure].backtrace.join("\n")
|
99
|
+
@log.debug "Backtrace CF: #{btr}"
|
100
|
+
end
|
101
101
|
rescue
|
102
102
|
@log.debug "Connect Fail oops"
|
103
103
|
end
|
@@ -124,6 +124,19 @@ class Slogger
|
|
124
124
|
begin
|
125
125
|
@log.debug "Miscellaneous Error #{info(parms)}"
|
126
126
|
@log.debug "Miscellaneous Error String #{errstr}"
|
127
|
+
@log.debug "Miscellaneous Error All Parms #{parms.inspect}"
|
128
|
+
if parms[:ssl_exception]
|
129
|
+
@log.debug "SSL Miscellaneous Error Parms: #{parms[:ssl_exception]}"
|
130
|
+
@log.debug "SSL Miscellaneous Error Message: #{parms[:ssl_exception].message}"
|
131
|
+
btr = parms[:ssl_execption].backtrace.join("\n")
|
132
|
+
@log.debug "Backtrace SME: #{btr}"
|
133
|
+
end
|
134
|
+
if parms[:cur_failure]
|
135
|
+
@log.debug "SSL Miscellaneous Error Parms2: #{parms[:cur_failure]}"
|
136
|
+
@log.debug "SSL Miscellaneous Error Message2: #{parms[:cur_failure].message}"
|
137
|
+
btr = parms[:cur_failure].backtrace.join("\n")
|
138
|
+
@log.debug "Backtrace SME2: #{btr}"
|
139
|
+
end
|
127
140
|
rescue
|
128
141
|
@log.debug "Miscellaneous Error oops"
|
129
142
|
end
|
@@ -163,8 +176,10 @@ class Slogger
|
|
163
176
|
# Log Receive
|
164
177
|
def on_receive(parms, result)
|
165
178
|
begin
|
166
|
-
@log.debug "Receive
|
167
|
-
|
179
|
+
@log.debug "Receive Message, Command: #{result.command}"
|
180
|
+
pl = result.body.length < @maxml ? result.body.length : @maxml
|
181
|
+
@log.debug "Receive Message, Body: #{result.body[0..pl]}"
|
182
|
+
@log.debug "Receive Message, Headers: #{result.headers}"
|
168
183
|
rescue
|
169
184
|
@log.debug "Receive oops"
|
170
185
|
end
|
@@ -262,7 +277,13 @@ class Slogger
|
|
262
277
|
def on_ssl_connectfail(parms)
|
263
278
|
begin
|
264
279
|
@log.debug "SSL Connect Fail Parms #{info(parms)}"
|
265
|
-
|
280
|
+
if parms[:ssl_exception]
|
281
|
+
@log.debug "SSL Connect Fail Exception Parms: #{parms[:ssl_exception]}"
|
282
|
+
@log.debug "SSL Connect Fail Message: #{parms[:ssl_exception].message}"
|
283
|
+
btr = parms[:ssl_exception].backtrace.join("\n")
|
284
|
+
@log.debug "Backtrace SCF: #{btr}"
|
285
|
+
end
|
286
|
+
|
266
287
|
rescue
|
267
288
|
@log.debug "SSL Connect Fail oops"
|
268
289
|
end
|
@@ -278,6 +299,7 @@ class Slogger
|
|
278
299
|
begin
|
279
300
|
@log.debug "HeartBeat Fire Parms #{info(parms)}"
|
280
301
|
@log.debug "HeartBeat Fire Send/Receive #{srind}"
|
302
|
+
@log.debug "HeartBeat Fire Firedata #{firedata.inspect}"
|
281
303
|
rescue
|
282
304
|
@log.debug "HeartBeat Fire oops"
|
283
305
|
end
|
data/examples/logexamp.rb
CHANGED
@@ -40,6 +40,9 @@ class LoggerExample
|
|
40
40
|
# //////////////////////////////////////////////////////////////////////////////
|
41
41
|
# A hash type connect *MUST* be used to enable callback logging.
|
42
42
|
# //////////////////////////////////////////////////////////////////////////////
|
43
|
+
# Note: running this example will generate a number of connect failures,
|
44
|
+
# because of the fake host in this connect hash.
|
45
|
+
# //////////////////////////////////////////////////////////////////////////////
|
43
46
|
hash = { :hosts => [
|
44
47
|
{:login => user, :passcode => password, :host => 'noonehome', :port => 2525,
|
45
48
|
:ssl => so},
|
data/examples/putget_file.rb
CHANGED
@@ -38,7 +38,7 @@ class FilePutGet
|
|
38
38
|
conn = get_connection()
|
39
39
|
puts "pgf005: Qname is: #{@qname}"
|
40
40
|
# Try to gracefully handle files that exceed broker size limits.
|
41
|
-
ph = {:
|
41
|
+
ph = {:persistent => true}
|
42
42
|
ph['suppress_content_length'] = 'yes' if suppresscl()
|
43
43
|
puts "pgf006: Headers are: #{ph.inspect}"
|
44
44
|
begin
|
@@ -76,4 +76,4 @@ end
|
|
76
76
|
#
|
77
77
|
e = FilePutGet.new()
|
78
78
|
e.doput()
|
79
|
-
e.doget()
|
79
|
+
# e.doget()
|
data/examples/stomp_common.rb
CHANGED
data/lib/client/utils.rb
CHANGED
@@ -175,6 +175,7 @@ module Stomp
|
|
175
175
|
@replay_messages_by_txn = {}
|
176
176
|
|
177
177
|
@listener_map = Hash.new do |message|
|
178
|
+
@failure = nil
|
178
179
|
unless @connection.slog(:on_miscerr, @connection.log_params, "Received unknown frame type: '#{message.command}'\n")
|
179
180
|
warn "Received unknown frame type: '#{message.command}'\n"
|
180
181
|
end
|
data/lib/connection/netio.rb
CHANGED
@@ -156,7 +156,8 @@ module Stomp
|
|
156
156
|
raise sfex
|
157
157
|
end
|
158
158
|
#
|
159
|
-
|
159
|
+
# Always decode headers, even for 1.0. Issue #160.
|
160
|
+
if msg.command != Stomp::CMD_CONNECTED
|
160
161
|
msg.headers = _decodeHeaders(msg.headers)
|
161
162
|
end
|
162
163
|
p [ "_receive_ends", msg.command, msg.headers ] if drdbg
|
@@ -227,9 +228,10 @@ module Stomp
|
|
227
228
|
dtrdbg = ENV['DTRDBG'] ? true : false
|
228
229
|
# p [ "wirewrite" ]
|
229
230
|
# _dump_callstack()
|
230
|
-
|
231
|
+
p [ "_transmit_headers_in1", headers ] if dtrdbg
|
231
232
|
if @protocol >= Stomp::SPL_11 && command != Stomp::CMD_CONNECT
|
232
233
|
headers = _encodeHeaders(headers)
|
234
|
+
p [ "_transmit_headers_in2", headers ] if dtrdbg
|
233
235
|
end
|
234
236
|
@transmit_semaphore.synchronize do
|
235
237
|
p [ "_transmit_lock", Thread::current() ] if dtrdbg
|
@@ -248,7 +250,9 @@ module Stomp
|
|
248
250
|
# Lets send this header in the message, so it can maintain state when using unreceive
|
249
251
|
headers[:'content-length'] = "#{body_length_bytes}" unless headers[:suppress_content_length]
|
250
252
|
headers[:'content-type'] = "text/plain; charset=UTF-8" unless headers[:'content-type'] || headers[:suppress_content_type]
|
253
|
+
p [ "_transmit_command", command ] if dtrdbg
|
251
254
|
_wire_write(used_socket,command)
|
255
|
+
p [ "_transmit_headers", headers ] if dtrdbg
|
252
256
|
headers.each do |k,v|
|
253
257
|
if v.is_a?(Array)
|
254
258
|
v.each do |e|
|
@@ -258,8 +262,10 @@ module Stomp
|
|
258
262
|
_wire_write(used_socket,"#{k}:#{v}")
|
259
263
|
end
|
260
264
|
end
|
265
|
+
p [ "_transmit_headers done" ] if dtrdbg
|
261
266
|
_wire_write(used_socket,"")
|
262
267
|
if body != ''
|
268
|
+
p [ "_transmit_body", body ] if dtrdbg
|
263
269
|
if headers[:suppress_content_length]
|
264
270
|
if tz = body.index("\00")
|
265
271
|
used_socket.write body[0..tz-1]
|
@@ -271,7 +277,8 @@ module Stomp
|
|
271
277
|
end
|
272
278
|
end
|
273
279
|
used_socket.write "\0"
|
274
|
-
used_socket.flush if autoflush
|
280
|
+
# used_socket.flush if autoflush
|
281
|
+
used_socket.flush
|
275
282
|
|
276
283
|
if @protocol >= Stomp::SPL_11
|
277
284
|
@ls = Time.now.to_f if @hbs
|
@@ -321,6 +328,7 @@ module Stomp
|
|
321
328
|
# open_ssl_socket opens an SSL socket.
|
322
329
|
def open_ssl_socket()
|
323
330
|
require 'openssl' unless defined?(OpenSSL)
|
331
|
+
ossdbg = ENV['OSSDBG'] ? true : false
|
324
332
|
begin # Any raised SSL exceptions
|
325
333
|
ctx = @sslctx_newparm ? OpenSSL::SSL::SSLContext.new(@sslctx_newparm) : OpenSSL::SSL::SSLContext.new
|
326
334
|
ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE # Assume for now
|
@@ -366,37 +374,66 @@ module Stomp
|
|
366
374
|
end
|
367
375
|
ctx.cert_store = truststores
|
368
376
|
end
|
369
|
-
|
377
|
+
#
|
378
|
+
p [ "OSSL50", "old code starts" ] if ossdbg
|
379
|
+
usecert = nil
|
380
|
+
usekey = nil
|
370
381
|
# Client authentication
|
371
382
|
# If cert exists as a file, then it should not be input as text
|
372
|
-
raise Stomp::Error::SSLClientParamsError if !@ssl.cert_file.nil? &&
|
383
|
+
raise Stomp::Error::SSLClientParamsError if !@ssl.cert_file.nil? &&
|
384
|
+
!@ssl.cert_text.nil?
|
373
385
|
# If cert exists as file, then key must exist, either as text or file
|
374
|
-
raise Stomp::Error::SSLClientParamsError if !@ssl.cert_file.nil? &&
|
386
|
+
raise Stomp::Error::SSLClientParamsError if !@ssl.cert_file.nil? &&
|
387
|
+
@ssl.key_file.nil? && @ssl.key_text.nil?
|
375
388
|
if @ssl.cert_file
|
376
389
|
raise Stomp::Error::SSLNoCertFileError if !File::exists?(@ssl.cert_file)
|
377
390
|
raise Stomp::Error::SSLUnreadableCertFileError if !File::readable?(@ssl.cert_file)
|
378
|
-
|
391
|
+
p [ "OSSL51", "old code cert file read" ] if ossdbg
|
392
|
+
usecert = OpenSSL::X509::Certificate.new(File.read(@ssl.cert_file))
|
379
393
|
end
|
380
|
-
|
381
394
|
# If cert exists as file, then key must exist, either as text or file
|
382
|
-
raise Stomp::Error::SSLClientParamsError if !@ssl.cert_text.nil? &&
|
395
|
+
raise Stomp::Error::SSLClientParamsError if !@ssl.cert_text.nil? &&
|
396
|
+
@ssl.key_file.nil? && @ssl.key_text.nil?
|
383
397
|
if @ssl.cert_text
|
384
|
-
|
398
|
+
p [ "OSSL52", "old code cert text get" ] if ossdbg
|
399
|
+
usecert = OpenSSL::X509::Certificate.new(@ssl.cert_text)
|
385
400
|
end
|
386
401
|
|
387
402
|
# If key exists as a text, then it should not be input as file
|
388
|
-
raise Stomp::Error::SSLClientParamsError if !@ssl.key_text.nil? &&
|
403
|
+
raise Stomp::Error::SSLClientParamsError if !@ssl.key_text.nil? &&
|
404
|
+
!@ssl.key_file.nil?
|
389
405
|
if @ssl.key_file
|
390
406
|
raise Stomp::Error::SSLNoKeyFileError if !File::exists?(@ssl.key_file)
|
391
407
|
raise Stomp::Error::SSLUnreadableKeyFileError if !File::readable?(@ssl.key_file)
|
392
|
-
|
408
|
+
p [ "OSSL53", "old code key file read" ] if ossdbg
|
409
|
+
usekey = OpenSSL::PKey::RSA.new(File.read(@ssl.key_file), @ssl.key_password)
|
393
410
|
end
|
394
411
|
|
395
412
|
if @ssl.key_text
|
396
413
|
nt = @ssl.key_text.gsub(/\t/, "")
|
397
|
-
|
414
|
+
p [ "OSSL54", "old code key text get" ] if ossdbg
|
415
|
+
usekey = OpenSSL::PKey::RSA.new(nt, @ssl.key_password)
|
398
416
|
end
|
399
|
-
|
417
|
+
#
|
418
|
+
# This style of code because: in newer Ruby versions the 'cert'
|
419
|
+
# and 'key' attributes are deprecated. It is suggested that the
|
420
|
+
# 'add_certificate' method be used instead.
|
421
|
+
#
|
422
|
+
if ctx.respond_to?(:add_certificate) # Newer Ruby version ??
|
423
|
+
p [ "OSSL55", "new code option", usecert, usekey ] if ossdbg
|
424
|
+
if !usecert.nil? && !usekey.nil?
|
425
|
+
p [ "OSSL55", "new code add_certificate" ] if ossdbg
|
426
|
+
ctx.add_certificate(usecert, usekey)
|
427
|
+
else
|
428
|
+
p [ "OSSL56", "new code SKIP add_certificate" ] if ossdbg
|
429
|
+
end
|
430
|
+
else
|
431
|
+
# Older Ruby versions
|
432
|
+
p [ "OSSL56", "old code option", usecert, usekey ] if ossdbg
|
433
|
+
ctx.cert = usecert
|
434
|
+
ctx.key = usekey
|
435
|
+
end
|
436
|
+
p [ "OSSL99", "old code ends" ] if ossdbg
|
400
437
|
# Cipher list
|
401
438
|
# As of this writing, there are numerous problems with supplying
|
402
439
|
# cipher lists to jruby. So we do not attempt to do that here.
|
@@ -457,8 +494,8 @@ module Stomp
|
|
457
494
|
ssl.close
|
458
495
|
end
|
459
496
|
#
|
460
|
-
puts ex.backtrace
|
461
|
-
$stdout.flush
|
497
|
+
puts ex.backtrace if ossdbg
|
498
|
+
$stdout.flush if ossdbg
|
462
499
|
raise # Reraise
|
463
500
|
end
|
464
501
|
end
|
data/lib/connection/utils.rb
CHANGED
@@ -252,6 +252,7 @@ module Stomp
|
|
252
252
|
noiosel = (@ssl || @jruby) ? true : false
|
253
253
|
return _receive(used_socket, connread, noiosel)
|
254
254
|
rescue Stomp::Error::MaxReconnectAttempts
|
255
|
+
@failure = $!
|
255
256
|
unless slog(:on_miscerr, log_params, "Reached MaxReconnectAttempts")
|
256
257
|
$stderr.print "Reached MaxReconnectAttempts\n"
|
257
258
|
end
|
data/lib/stomp/connection.rb
CHANGED
@@ -492,6 +492,7 @@ module Stomp
|
|
492
492
|
super_result = __old_receive()
|
493
493
|
if super_result.nil? && @reliable && !closed?
|
494
494
|
errstr = "connection.receive returning EOF as nil - resetting connection.\n"
|
495
|
+
@failure = nil
|
495
496
|
unless slog(:on_miscerr, log_params, "es_recv: " + errstr)
|
496
497
|
$stderr.print errstr
|
497
498
|
end
|
data/lib/stomp/version.rb
CHANGED
data/stomp.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: stomp 1.4.
|
5
|
+
# stub: stomp 1.4.9 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "stomp".freeze
|
9
|
-
s.version = "1.4.
|
9
|
+
s.version = "1.4.9"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib".freeze]
|
13
13
|
s.authors = ["Brian McCallister".freeze, "Marius Mathiesen".freeze, "Thiago Morello".freeze, "Guy M. Allard".freeze]
|
14
|
-
s.date = "
|
14
|
+
s.date = "2019-11-16"
|
15
15
|
s.description = "Ruby client for the Stomp messaging protocol.".freeze
|
16
16
|
s.email = ["brianm@apache.org".freeze, "marius@stones.com".freeze, "morellon@gmail.com".freeze, "allard.guy.m@gmail.com".freeze]
|
17
17
|
s.executables = ["catstomp".freeze, "stompcat".freeze]
|
@@ -42,6 +42,9 @@ Gem::Specification.new do |s|
|
|
42
42
|
"examples/client_conndisc.rb",
|
43
43
|
"examples/client_putget.rb",
|
44
44
|
"examples/conn_conndisc.rb",
|
45
|
+
"examples/conn_get.rb",
|
46
|
+
"examples/conn_put.rb",
|
47
|
+
"examples/conn_put_pace.rb",
|
45
48
|
"examples/conn_putget.rb",
|
46
49
|
"examples/contrib.sh",
|
47
50
|
"examples/contributors.rb",
|
data/test/test_anonymous.rb
CHANGED
@@ -84,7 +84,9 @@ class TestAnonymous < Test::Unit::TestCase
|
|
84
84
|
p [ "01", mn, "starts" ] if @tandbg
|
85
85
|
conn_subscribe make_destination, :receipt => "abc"
|
86
86
|
msg = @conn.receive
|
87
|
-
|
87
|
+
tval = msg.headers['receipt-id']
|
88
|
+
tval = msg.headers['receipt-id'][0] if msg.headers['receipt-id'].is_a?(Array)
|
89
|
+
assert_equal "abc", tval
|
88
90
|
checkEmsg(@conn)
|
89
91
|
p [ "99", mn, "ends" ] if @tandbg
|
90
92
|
end
|
data/test/test_connection.rb
CHANGED
@@ -82,9 +82,14 @@ class TestConnection < Test::Unit::TestCase
|
|
82
82
|
def test_receipt
|
83
83
|
mn = "test_receipt" if @tcndbg
|
84
84
|
p [ "01", mn, "starts" ] if @tcndbg
|
85
|
+
p [ "02", @conn.protocol ] if @tcndbg
|
85
86
|
conn_subscribe make_destination, :receipt => "abc"
|
86
87
|
msg = @conn.receive
|
87
|
-
|
88
|
+
p [ "05", msg.headers['receipt-id'].class, msg.headers['receipt-id'].is_a?(Array) ] if @tcndbg
|
89
|
+
#
|
90
|
+
tval = msg.headers['receipt-id']
|
91
|
+
tval = msg.headers['receipt-id'][0] if msg.headers['receipt-id'].is_a?(Array)
|
92
|
+
assert_equal "abc", tval
|
88
93
|
checkEmsg(@conn)
|
89
94
|
p [ "99", mn, "ends" ] if @tcndbg
|
90
95
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stomp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian McCallister
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2019-11-16 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: rspec
|
@@ -69,6 +69,9 @@ files:
|
|
69
69
|
- examples/client_conndisc.rb
|
70
70
|
- examples/client_putget.rb
|
71
71
|
- examples/conn_conndisc.rb
|
72
|
+
- examples/conn_get.rb
|
73
|
+
- examples/conn_put.rb
|
74
|
+
- examples/conn_put_pace.rb
|
72
75
|
- examples/conn_putget.rb
|
73
76
|
- examples/contrib.sh
|
74
77
|
- examples/contributors.rb
|