stomp 1.2.4 → 1.2.5
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.
- data/CHANGELOG.rdoc +11 -0
- data/README.rdoc +38 -26
- data/Rakefile +3 -0
- data/bin/catstomp +34 -34
- data/bin/stompcat +36 -36
- data/examples/client11_ex1.rb +64 -55
- data/examples/client11_putget1.rb +47 -35
- data/examples/conn11_ex1.rb +59 -51
- data/examples/conn11_ex2.rb +59 -50
- data/examples/conn11_hb1.rb +35 -26
- data/examples/consumer.rb +25 -12
- data/examples/get11conn_ex1.rb +97 -89
- data/examples/get11conn_ex2.rb +55 -47
- data/examples/logexamp.rb +66 -52
- data/examples/logexamp_ssl.rb +66 -52
- data/examples/publisher.rb +21 -10
- data/examples/put11conn_ex1.rb +35 -24
- data/examples/putget11_rh1.rb +66 -56
- data/examples/slogger.rb +65 -52
- data/examples/ssl_uc1.rb +24 -13
- data/examples/ssl_uc1_ciphers.rb +28 -15
- data/examples/ssl_uc2.rb +26 -16
- data/examples/ssl_uc2_ciphers.rb +31 -18
- data/examples/ssl_uc3.rb +25 -14
- data/examples/ssl_uc3_ciphers.rb +31 -18
- data/examples/ssl_uc4.rb +26 -15
- data/examples/ssl_uc4_ciphers.rb +32 -19
- data/examples/ssl_ucx_default_ciphers.rb +25 -12
- data/examples/stomp11_common.rb +16 -15
- data/examples/topic_consumer.rb +23 -10
- data/examples/topic_publisher.rb +22 -8
- data/lib/client/utils.rb +116 -0
- data/lib/connection/heartbeats.rb +173 -0
- data/lib/connection/netio.rb +322 -0
- data/lib/connection/utf8.rb +294 -0
- data/lib/connection/utils.rb +104 -0
- data/lib/stomp/client.rb +127 -179
- data/lib/stomp/codec.rb +5 -2
- data/lib/stomp/connection.rb +109 -865
- data/lib/stomp/constants.rb +52 -33
- data/lib/stomp/errors.rb +56 -5
- data/lib/stomp/ext/hash.rb +4 -0
- data/lib/stomp/message.rb +49 -29
- data/lib/stomp/sslparams.rb +83 -71
- data/lib/stomp/version.rb +3 -1
- data/lib/stomp.rb +18 -9
- data/stomp.gemspec +58 -3
- data/test/test_client.rb +28 -1
- data/test/test_codec.rb +8 -2
- data/test/test_connection.rb +29 -0
- data/test/test_connection1p.rb +31 -16
- data/test/test_helper.rb +20 -3
- data/test/test_message.rb +8 -3
- data/test/test_ssl.rb +10 -4
- data/test/tlogger.rb +16 -15
- metadata +59 -4
data/lib/stomp/constants.rb
CHANGED
@@ -2,28 +2,28 @@
|
|
2
2
|
|
3
3
|
module Stomp
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
5
|
+
# Client side
|
6
|
+
CMD_CONNECT = "CONNECT"
|
7
|
+
CMD_STOMP = "STOMP"
|
8
|
+
CMD_DISCONNECT = "DISCONNECT"
|
9
|
+
CMD_SEND = "SEND"
|
10
|
+
CMD_SUBSCRIBE = "SUBSCRIBE"
|
11
|
+
CMD_UNSUBSCRIBE = "UNSUBSCRIBE"
|
12
|
+
CMD_ACK = "ACK"
|
13
|
+
CMD_NACK = "NACK"
|
14
|
+
CMD_BEGIN = "BEGIN"
|
15
|
+
CMD_COMMIT = "COMMIT"
|
16
|
+
CMD_ABORT = "ABORT"
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
# Server side
|
19
|
+
CMD_CONNECTED = "CONNECTED"
|
20
|
+
CMD_MESSAGE = "MESSAGE"
|
21
|
+
CMD_RECEIPT = "RECEIPT"
|
22
|
+
CMD_ERROR = "ERROR"
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
# Protocols
|
25
|
+
SPL_10 = "1.0"
|
26
|
+
SPL_11 = "1.1"
|
27
27
|
|
28
28
|
# Stomp 1.0 and 1.1
|
29
29
|
SUPPORTED = [SPL_10, SPL_11]
|
@@ -38,44 +38,63 @@ module Stomp
|
|
38
38
|
# New line
|
39
39
|
#
|
40
40
|
NL = "\n"
|
41
|
-
|
41
|
+
NL_ASCII = 0x0a
|
42
42
|
#
|
43
43
|
# Back Slash
|
44
44
|
#
|
45
45
|
BACK_SLASH = "\\"
|
46
|
-
|
46
|
+
BACK_SLASH_ASCII = 0x5c
|
47
47
|
#
|
48
48
|
# Literal colon
|
49
49
|
#
|
50
50
|
LITERAL_COLON = ":"
|
51
|
-
|
51
|
+
COLON_ASCII = 0x3a
|
52
52
|
#
|
53
53
|
# Literal letter c
|
54
54
|
#
|
55
55
|
LITERAL_C = "c"
|
56
|
-
|
56
|
+
C_ASCII = 0x63
|
57
57
|
#
|
58
58
|
# Literal letter n
|
59
59
|
#
|
60
60
|
LITERAL_N = "n"
|
61
|
-
|
61
|
+
N_ASCII = 0x6e
|
62
62
|
#
|
63
63
|
# Codec from/to values.
|
64
64
|
#
|
65
65
|
ENCODE_VALUES = [
|
66
|
-
|
67
|
-
|
68
|
-
|
66
|
+
"\\\\", "\\", # encoded, decoded
|
67
|
+
"\\" + "n", "\n",
|
68
|
+
"\\c", ":",
|
69
69
|
]
|
70
70
|
|
71
71
|
#
|
72
72
|
DECODE_VALUES = [
|
73
|
-
|
74
|
-
|
75
|
-
|
73
|
+
"\\\\\\\\", "\\", # encoded, decoded
|
74
|
+
"\\" + "n", "\n",
|
75
|
+
"\\c", ":",
|
76
76
|
]
|
77
77
|
|
78
|
-
DEFAULT_CIPHERS = [
|
79
|
-
["
|
78
|
+
DEFAULT_CIPHERS = [
|
79
|
+
["DHE-RSA-AES256-SHA", "TLSv1/SSLv3", 256, 256],
|
80
|
+
["DHE-DSS-AES256-SHA", "TLSv1/SSLv3", 256, 256],
|
81
|
+
["AES256-SHA", "TLSv1/SSLv3", 256, 256],
|
82
|
+
["EDH-RSA-DES-CBC3-SHA", "TLSv1/SSLv3", 168, 168],
|
83
|
+
["EDH-DSS-DES-CBC3-SHA", "TLSv1/SSLv3", 168, 168],
|
84
|
+
["DES-CBC3-SHA", "TLSv1/SSLv3", 168, 168],
|
85
|
+
["DHE-RSA-AES128-SHA", "TLSv1/SSLv3", 128, 128],
|
86
|
+
["DHE-DSS-AES128-SHA", "TLSv1/SSLv3", 128, 128],
|
87
|
+
["AES128-SHA", "TLSv1/SSLv3", 128, 128],
|
88
|
+
["RC4-SHA", "TLSv1/SSLv3", 128, 128],
|
89
|
+
["RC4-MD5", "TLSv1/SSLv3", 128, 128],
|
90
|
+
["EDH-RSA-DES-CBC-SHA", "TLSv1/SSLv3", 56, 56],
|
91
|
+
["EDH-DSS-DES-CBC-SHA", "TLSv1/SSLv3", 56, 56],
|
92
|
+
["DES-CBC-SHA", "TLSv1/SSLv3", 56, 56],
|
93
|
+
["EXP-EDH-RSA-DES-CBC-SHA", "TLSv1/SSLv3", 40, 56],
|
94
|
+
["EXP-EDH-DSS-DES-CBC-SHA", "TLSv1/SSLv3", 40, 56],
|
95
|
+
["EXP-DES-CBC-SHA", "TLSv1/SSLv3", 40, 56],
|
96
|
+
["EXP-RC2-CBC-MD5", "TLSv1/SSLv3", 40, 128],
|
97
|
+
["EXP-RC4-MD5", "TLSv1/SSLv3", 40, 128],
|
98
|
+
]
|
80
99
|
|
81
100
|
end
|
data/lib/stomp/errors.rb
CHANGED
@@ -1,139 +1,190 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
|
3
3
|
module Stomp
|
4
|
+
|
5
|
+
# Module level container for Stomp gem error classes.
|
4
6
|
module Error
|
7
|
+
|
8
|
+
# InvalidFormat is raised if:
|
9
|
+
# * During frame parsing if a malformed frame is detected.
|
5
10
|
class InvalidFormat < RuntimeError
|
6
11
|
def message
|
7
12
|
"Invalid message - invalid format"
|
8
13
|
end
|
9
14
|
end
|
10
15
|
|
16
|
+
# InvalidServerCommand is raised if:
|
17
|
+
# * An invalid STOMP COMMAND is received from the server.
|
11
18
|
class InvalidServerCommand < RuntimeError
|
12
19
|
def message
|
13
20
|
"Invalid command from server"
|
14
21
|
end
|
15
22
|
end
|
16
23
|
|
24
|
+
# InvalidMessageLength is raised if:
|
25
|
+
# * An invalid message length is detected during a frame read.
|
17
26
|
class InvalidMessageLength < RuntimeError
|
18
27
|
def message
|
19
28
|
"Invalid content length received"
|
20
29
|
end
|
21
30
|
end
|
22
31
|
|
32
|
+
# PacketParsingTimeout is raised if:
|
33
|
+
# * A frame read has started, but does not complete in 5 seconds.
|
34
|
+
# * Use :parse_timeout connect parameter to override the timeout.
|
23
35
|
class PacketParsingTimeout < RuntimeError
|
24
36
|
def message
|
25
37
|
"Packet parsing timeout"
|
26
38
|
end
|
27
39
|
end
|
28
40
|
|
41
|
+
# SocketOpenTimeout is raised if:
|
42
|
+
# * A timeout occurs during a socket open.
|
29
43
|
class SocketOpenTimeout < RuntimeError
|
30
44
|
def message
|
31
45
|
"Socket open timeout"
|
32
46
|
end
|
33
47
|
end
|
34
48
|
|
49
|
+
# NoCurrentConnection is raised if:
|
50
|
+
# * Any method is called when a current connection does not exist.
|
35
51
|
class NoCurrentConnection < RuntimeError
|
36
52
|
def message
|
37
53
|
"no current connection exists"
|
38
54
|
end
|
39
55
|
end
|
40
|
-
|
56
|
+
|
57
|
+
# MaxReconnectAttempts is raised if:
|
58
|
+
# * The maximum number of retries has been reached for a reliable connection.
|
41
59
|
class MaxReconnectAttempts < RuntimeError
|
42
60
|
def message
|
43
61
|
"Maximum number of reconnection attempts reached"
|
44
62
|
end
|
45
63
|
end
|
46
|
-
|
64
|
+
|
65
|
+
# DuplicateSubscription is raised if:
|
66
|
+
# * A duplicate subscription ID is detected in the current session.
|
47
67
|
class DuplicateSubscription < RuntimeError
|
48
68
|
def message
|
49
69
|
"duplicate subscriptions are disallowed"
|
50
70
|
end
|
51
71
|
end
|
52
|
-
|
72
|
+
|
73
|
+
# ProtocolErrorConnect is raised if:
|
74
|
+
# * Incomplete Stomp 1.1 headers are detectd during a connect.
|
53
75
|
class ProtocolErrorConnect < RuntimeError
|
54
76
|
def message
|
55
77
|
"protocol error on CONNECT"
|
56
78
|
end
|
57
79
|
end
|
58
|
-
|
80
|
+
|
81
|
+
# UnsupportedProtocolError is raised if:
|
82
|
+
# * No supported Stomp protocol levels are detected during a connect.
|
59
83
|
class UnsupportedProtocolError < RuntimeError
|
60
84
|
def message
|
61
85
|
"unsupported protocol level(s)"
|
62
86
|
end
|
63
87
|
end
|
64
|
-
|
88
|
+
|
89
|
+
# InvalidHeartBeatHeaderError is raised if:
|
90
|
+
# * A "heart-beat" header is present, but the values are malformed.
|
65
91
|
class InvalidHeartBeatHeaderError < RuntimeError
|
66
92
|
def message
|
67
93
|
"heart-beat header value is malformed"
|
68
94
|
end
|
69
95
|
end
|
70
96
|
|
97
|
+
# SubscriptionRequiredError is raised if:
|
98
|
+
# * No subscription id is specified for a Stomp 1.1 subscribe.
|
71
99
|
class SubscriptionRequiredError < RuntimeError
|
72
100
|
def message
|
73
101
|
"a valid subscription id header is required"
|
74
102
|
end
|
75
103
|
end
|
76
104
|
|
105
|
+
# UTF8ValidationError is raised if:
|
106
|
+
# * Stomp 1.1 headers are not valid UTF8.
|
77
107
|
class UTF8ValidationError < RuntimeError
|
78
108
|
def message
|
79
109
|
"header is invalid UTF8"
|
80
110
|
end
|
81
111
|
end
|
82
112
|
|
113
|
+
# MessageIDRequiredError is raised if:
|
114
|
+
# * No messageid parameter is specified for ACK or NACK.
|
83
115
|
class MessageIDRequiredError < RuntimeError
|
84
116
|
def message
|
85
117
|
"a valid message id is required for ACK/NACK"
|
86
118
|
end
|
87
119
|
end
|
88
120
|
|
121
|
+
# SSLClientParamsError is raised if:
|
122
|
+
# * Incomplete SSLParams are specified for an SSL connect.
|
89
123
|
class SSLClientParamsError < RuntimeError
|
90
124
|
def message
|
91
125
|
"certificate and key files are both required"
|
92
126
|
end
|
93
127
|
end
|
94
128
|
|
129
|
+
# StompServerError is raised if:
|
130
|
+
# * Invalid (nil) data is received from the Stomp server.
|
95
131
|
class StompServerError < RuntimeError
|
96
132
|
def message
|
97
133
|
"Connected, header read is nil, is this really a Stomp Server?"
|
98
134
|
end
|
99
135
|
end
|
100
136
|
|
137
|
+
# SSLNoKeyFileError is raised if:
|
138
|
+
# * A supplied key file does not exist.
|
101
139
|
class SSLNoKeyFileError < RuntimeError
|
102
140
|
def message
|
103
141
|
"client key file does not exist"
|
104
142
|
end
|
105
143
|
end
|
106
144
|
|
145
|
+
# SSLUnreadableKeyFileError is raised if:
|
146
|
+
# * A supplied key file is not readable.
|
107
147
|
class SSLUnreadableKeyFileError < RuntimeError
|
108
148
|
def message
|
109
149
|
"client key file can not be read"
|
110
150
|
end
|
111
151
|
end
|
112
152
|
|
153
|
+
# SSLNoCertFileError is raised if:
|
154
|
+
# * A supplied SSL cert file does not exist.
|
113
155
|
class SSLNoCertFileError < RuntimeError
|
114
156
|
def message
|
115
157
|
"client cert file does not exist"
|
116
158
|
end
|
117
159
|
end
|
118
160
|
|
161
|
+
# SSLUnreadableCertFileError is raised if:
|
162
|
+
# * A supplied SSL cert file is not readable.
|
119
163
|
class SSLUnreadableCertFileError < RuntimeError
|
120
164
|
def message
|
121
165
|
"client cert file can not be read"
|
122
166
|
end
|
123
167
|
end
|
124
168
|
|
169
|
+
# SSLNoTruststoreFileError is raised if:
|
170
|
+
# * A supplied SSL trust store file does not exist.
|
125
171
|
class SSLNoTruststoreFileError < RuntimeError
|
126
172
|
def message
|
127
173
|
"a client truststore file does not exist"
|
128
174
|
end
|
129
175
|
end
|
130
176
|
|
177
|
+
# SSLUnreadableTruststoreFileError is raised if:
|
178
|
+
# * A supplied SSL trust store file is not readable.
|
131
179
|
class SSLUnreadableTruststoreFileError < RuntimeError
|
132
180
|
def message
|
133
181
|
"a client truststore file can not be read"
|
134
182
|
end
|
135
183
|
end
|
136
184
|
|
185
|
+
# LoggerConnectionError is not raised by the gem. It may be
|
186
|
+
# raised by client logic in callback logger methods to signal
|
187
|
+
# that a connection should not proceed.
|
137
188
|
class LoggerConnectionError < RuntimeError
|
138
189
|
end
|
139
190
|
|
data/lib/stomp/ext/hash.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
|
3
3
|
class ::Hash
|
4
|
+
|
5
|
+
# Returns self with keys uncamelized and converted to symbols.
|
4
6
|
def uncamelize_and_symbolize_keys
|
5
7
|
self.uncamelize_and_stringify_keys.symbolize_keys
|
6
8
|
end
|
7
9
|
|
10
|
+
# Returns self with keys uncamelized and converted to strings.
|
8
11
|
def uncamelize_and_stringify_keys
|
9
12
|
uncamelized = {}
|
10
13
|
self.each_pair do |key, value|
|
@@ -15,6 +18,7 @@ class ::Hash
|
|
15
18
|
uncamelized
|
16
19
|
end
|
17
20
|
|
21
|
+
# Returns self with all keys symbolized.
|
18
22
|
def symbolize_keys
|
19
23
|
symbolized = {}
|
20
24
|
self.each_pair do |key, value|
|
data/lib/stomp/message.rb
CHANGED
@@ -2,39 +2,54 @@
|
|
2
2
|
|
3
3
|
module Stomp
|
4
4
|
|
5
|
-
#
|
5
|
+
# Message is a container class for frames. Misnamed technically.
|
6
6
|
class Message
|
7
|
-
attr_accessor :command, :headers, :body, :original
|
8
7
|
|
9
|
-
|
8
|
+
public
|
10
9
|
|
10
|
+
# The COMMAND value.
|
11
|
+
attr_accessor :command
|
12
|
+
|
13
|
+
# The Headers Hash.
|
14
|
+
attr_accessor :headers
|
15
|
+
|
16
|
+
# The message Body.
|
17
|
+
attr_accessor :body
|
18
|
+
|
19
|
+
# The original input(s).
|
20
|
+
attr_accessor :original
|
21
|
+
|
22
|
+
# Commands that are allowed from the wire per the specifications.
|
23
|
+
@@allowed_commands = [ Stomp::CMD_CONNECTED, Stomp::CMD_MESSAGE, Stomp::CMD_RECEIPT, Stomp::CMD_ERROR ]
|
24
|
+
|
25
|
+
# initialize returns a Message from a raw physical frame.
|
11
26
|
def initialize(frame, protocol11p = false)
|
12
|
-
|
27
|
+
# p [ "00", frame, frame.encoding ]
|
13
28
|
# Set default empty values
|
14
29
|
self.command = ''
|
15
30
|
self.headers = {}
|
16
31
|
self.body = ''
|
17
32
|
self.original = frame
|
18
33
|
return self if is_blank?(frame)
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
34
|
+
# Figure out where individual parts of the frame begin and end.
|
35
|
+
command_index = frame.index("\n")
|
36
|
+
raise Stomp::Error::InvalidFormat, 'command index' unless command_index
|
37
|
+
#
|
38
|
+
headers_index = frame.index("\n\n", command_index+1)
|
39
|
+
raise Stomp::Error::InvalidFormat, 'headers index' unless headers_index
|
40
|
+
#
|
41
|
+
lastnull_index = frame.rindex("\0")
|
42
|
+
raise Stomp::Error::InvalidFormat, 'lastnull index' unless lastnull_index
|
43
|
+
|
44
|
+
# Extract working copies of each frame part
|
45
|
+
work_command = frame[0..command_index-1]
|
46
|
+
raise Stomp::Error::InvalidServerCommand, "invalid command: #{work_command.inspect}" unless @@allowed_commands.include?(work_command)
|
47
|
+
#
|
48
|
+
work_headers = frame[command_index+1..headers_index-1]
|
49
|
+
raise Stomp::Error::InvalidFormat, 'nil headers' unless work_headers
|
50
|
+
#
|
51
|
+
work_body = frame[headers_index+2..lastnull_index-1]
|
52
|
+
raise Stomp::Error::InvalidFormat, 'nil body' unless work_body
|
38
53
|
# Set the frame values
|
39
54
|
if protocol11p
|
40
55
|
work_command.force_encoding(Stomp::UTF8) if work_command.respond_to?(:force_encoding)
|
@@ -42,7 +57,7 @@ module Stomp
|
|
42
57
|
self.command = work_command
|
43
58
|
work_headers.split("\n").map do |value|
|
44
59
|
parsed_value = value.match /^([\r|\w|-]*):(.*)$/
|
45
|
-
|
60
|
+
raise Stomp::Error::InvalidFormat, 'parsed header value' unless parsed_value
|
46
61
|
#
|
47
62
|
pk = parsed_value[1]
|
48
63
|
pv = parsed_value[2]
|
@@ -71,7 +86,7 @@ module Stomp
|
|
71
86
|
end
|
72
87
|
|
73
88
|
body_length = -1
|
74
|
-
|
89
|
+
|
75
90
|
if self.headers['content-length']
|
76
91
|
body_length = self.headers['content-length'].to_i
|
77
92
|
raise Stomp::Error::InvalidMessageLength if work_body.length != body_length
|
@@ -79,18 +94,23 @@ module Stomp
|
|
79
94
|
self.body = work_body[0..body_length]
|
80
95
|
end
|
81
96
|
|
97
|
+
# to_s returns a string prepresentation of this Message
|
82
98
|
def to_s
|
83
99
|
"<Stomp::Message headers=#{headers.inspect} body='#{body}' command='#{command}' >"
|
84
100
|
end
|
85
101
|
|
102
|
+
private
|
103
|
+
|
104
|
+
# is_blank? tests if a data value is nil or empty.
|
105
|
+
def is_blank?(value)
|
106
|
+
value.nil? || (value.respond_to?(:empty?) && value.empty?)
|
107
|
+
end
|
108
|
+
|
109
|
+
# empty? tests if a Message has any blank parts.
|
86
110
|
def empty?
|
87
111
|
is_blank?(command) && is_blank?(headers) && is_blank?(body)
|
88
112
|
end
|
89
113
|
|
90
|
-
private
|
91
|
-
def is_blank?(value)
|
92
|
-
value.nil? || (value.respond_to?(:empty?) && value.empty?)
|
93
|
-
end
|
94
114
|
end
|
95
115
|
|
96
116
|
end
|
data/lib/stomp/sslparams.rb
CHANGED
@@ -1,72 +1,84 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
module
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
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
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module Stomp
|
4
|
+
#
|
5
|
+
# == Purpose
|
6
|
+
#
|
7
|
+
# Parameters for STOMP ssl connections.
|
8
|
+
#
|
9
|
+
class SSLParams
|
10
|
+
|
11
|
+
# The trust store files. Normally the certificate of the CA that signed
|
12
|
+
# the server's certificate. One file name, or a CSV list of file names.
|
13
|
+
attr_accessor :ts_files
|
14
|
+
|
15
|
+
# The client certificate file.
|
16
|
+
attr_accessor :cert_file
|
17
|
+
|
18
|
+
# The client private key file.
|
19
|
+
attr_accessor :key_file
|
20
|
+
|
21
|
+
# The client private key password.
|
22
|
+
attr_accessor :key_password
|
23
|
+
|
24
|
+
# SSL Connect Verify Result. The result of the handshake.
|
25
|
+
attr_accessor :verify_result
|
26
|
+
|
27
|
+
# The certificate of the connection peer (the server), received during
|
28
|
+
# the handshake.
|
29
|
+
attr_accessor :peer_cert
|
30
|
+
|
31
|
+
# Optional list of SSL ciphers to be used. In the format documented for
|
32
|
+
# Ruby's OpenSSL.
|
33
|
+
attr_accessor :ciphers
|
34
|
+
|
35
|
+
# Absolute command to use Ruby default ciphers.
|
36
|
+
attr_reader :use_ruby_ciphers
|
37
|
+
|
38
|
+
# Back reference to the OpenSSL::SSL::SSLContext instance, gem sets before connect.
|
39
|
+
attr_accessor :ctx # Set by the gem during connect, before the callbacks
|
40
|
+
|
41
|
+
# Client wants file existance check on initialize. true/value or false/nil.
|
42
|
+
attr_reader :fsck #
|
43
|
+
|
44
|
+
# initialize returns a valid set of SSLParams or raises an error.
|
45
|
+
def initialize(opts={})
|
46
|
+
|
47
|
+
# Server authentication parameters
|
48
|
+
@ts_files = opts[:ts_files] # A trust store file, normally a CA's cert
|
49
|
+
# or a CSV list of cert file names
|
50
|
+
|
51
|
+
# Client authentication parameters
|
52
|
+
@cert_file = opts[:cert_file] # Client cert
|
53
|
+
@key_file = opts[:key_file] # Client key
|
54
|
+
@key_password = opts[:key_password] # Client key password
|
55
|
+
#
|
56
|
+
raise Stomp::Error::SSLClientParamsError if @cert_file.nil? && !@key_file.nil?
|
57
|
+
raise Stomp::Error::SSLClientParamsError if !@cert_file.nil? && @key_file.nil?
|
58
|
+
#
|
59
|
+
@ciphers = opts[:ciphers]
|
60
|
+
@use_ruby_ciphers = opts[:use_ruby_ciphers] ? opts[:use_ruby_ciphers] : false
|
61
|
+
#
|
62
|
+
if opts[:fsck]
|
63
|
+
if @cert_file
|
64
|
+
raise Stomp::Error::SSLNoCertFileError if !File::exists?(@cert_file)
|
65
|
+
raise Stomp::Error::SSLUnreadableCertFileError if !File::readable?(@cert_file)
|
66
|
+
end
|
67
|
+
if @key_file
|
68
|
+
raise Stomp::Error::SSLNoKeyFileError if !File::exists?(@key_file)
|
69
|
+
raise Stomp::Error::SSLUnreadableKeyFileError if !File::readable?(@key_file)
|
70
|
+
end
|
71
|
+
if @ts_files
|
72
|
+
tsa = @ts_files.split(",")
|
73
|
+
tsa.each do |fn|
|
74
|
+
raise Stomp::Error::SSLNoTruststoreFileError if !File::exists?(fn)
|
75
|
+
raise Stomp::Error::SSLUnreadableTruststoreFileError if !File::readable?(fn)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
end # of class SSLParams
|
82
|
+
|
83
|
+
end # of module Stomp
|
72
84
|
|
data/lib/stomp/version.rb
CHANGED
data/lib/stomp.rb
CHANGED
@@ -15,15 +15,24 @@
|
|
15
15
|
# See the License for the specific language governing permissions and
|
16
16
|
# limitations under the License.
|
17
17
|
|
18
|
-
require 'stomp/constants'
|
19
|
-
require 'stomp/ext/hash'
|
20
|
-
require 'stomp/connection'
|
21
|
-
require 'stomp/client'
|
22
|
-
require 'stomp/message'
|
23
|
-
require 'stomp/version'
|
24
|
-
require 'stomp/errors'
|
25
|
-
require 'stomp/codec'
|
26
|
-
require 'stomp/sslparams'
|
18
|
+
require 'stomp/constants' # Constants first
|
19
|
+
require 'stomp/ext/hash' # #Hash additions
|
20
|
+
require 'stomp/connection' # Main Stomp#Connection
|
21
|
+
require 'stomp/client' # Main Stomp#Client
|
22
|
+
require 'stomp/message' # Stomp#Message
|
23
|
+
require 'stomp/version' # Stomp#Version#STRING
|
24
|
+
require 'stomp/errors' # All Stomp# exceptions
|
25
|
+
require 'stomp/codec' # Stomp 1.1 codec
|
26
|
+
require 'stomp/sslparams' # Stomp SSL support
|
27
|
+
|
28
|
+
# Private methods in #Client
|
29
|
+
require 'client/utils' # private Client Utility methods
|
30
|
+
|
31
|
+
# Private methods in #Connection
|
32
|
+
require 'connection/utils' # private Connection Utility methods
|
33
|
+
require 'connection/netio' # private Network io methods
|
34
|
+
require 'connection/heartbeats' # private 1.1+ heartbeat related methods
|
35
|
+
require 'connection/utf8' # private 1.1+ UTF8 related methods
|
27
36
|
|
28
37
|
module Stomp
|
29
38
|
end
|