stomp 1.2.4 → 1.2.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|