stomp 1.1.10 → 1.2.0

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.
@@ -0,0 +1,78 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Stomp
4
+
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
+
18
+ # Server side
19
+ CMD_CONNECTED = "CONNECTED"
20
+ CMD_MESSAGE = "MESSAGE"
21
+ CMD_RECEIPT = "RECEIPT"
22
+ CMD_ERROR = "ERROR"
23
+
24
+ # Protocols
25
+ SPL_10 = "1.0"
26
+ SPL_11 = "1.1"
27
+
28
+ # To be: No 1.1 yet
29
+ SUPPORTED = [SPL_10, SPL_11]
30
+
31
+ # 1.9 Encoding Name
32
+ UTF8 = "UTF-8"
33
+ #
34
+ # Octet 0
35
+ #
36
+ NULL = "\0"
37
+ #
38
+ # New line
39
+ #
40
+ NL = "\n"
41
+ NL_ASCII = 0x0a
42
+ #
43
+ # Back Slash
44
+ #
45
+ BACK_SLASH = "\\"
46
+ BACK_SLASH_ASCII = 0x5c
47
+ #
48
+ # Literal colon
49
+ #
50
+ LITERAL_COLON = ":"
51
+ COLON_ASCII = 0x3a
52
+ #
53
+ # Literal letter c
54
+ #
55
+ LITERAL_C = "c"
56
+ C_ASCII = 0x63
57
+ #
58
+ # Literal letter n
59
+ #
60
+ LITERAL_N = "n"
61
+ N_ASCII = 0x6e
62
+ #
63
+ # Codec from/to values.
64
+ #
65
+ ENCODE_VALUES = [
66
+ "\\\\", "\\", # encoded, decoded
67
+ "\\" + "n", "\n",
68
+ "\\c", ":",
69
+ ]
70
+
71
+ #
72
+ DECODE_VALUES = [
73
+ "\\\\\\\\", "\\", # encoded, decoded
74
+ "\\" + "n", "\n",
75
+ "\\c", ":",
76
+ ]
77
+
78
+ end
data/lib/stomp/errors.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  module Stomp
2
4
  module Error
3
5
  class InvalidFormat < RuntimeError
@@ -23,11 +25,67 @@ module Stomp
23
25
  "Packet parsing timeout"
24
26
  end
25
27
  end
28
+
29
+ class SocketOpenTimeout < RuntimeError
30
+ def message
31
+ "Socket open timeout"
32
+ end
33
+ end
34
+
35
+ class NoCurrentConnection < RuntimeError
36
+ def message
37
+ "no current connection exists"
38
+ end
39
+ end
26
40
 
27
41
  class MaxReconnectAttempts < RuntimeError
28
42
  def message
29
43
  "Maximum number of reconnection attempts reached"
30
44
  end
31
45
  end
32
- end
33
- end
46
+
47
+ class DuplicateSubscription < RuntimeError
48
+ def message
49
+ "duplicate subscriptions are disallowed"
50
+ end
51
+ end
52
+
53
+ class ProtocolErrorConnect < RuntimeError
54
+ def message
55
+ "protocol error on CONNECT"
56
+ end
57
+ end
58
+
59
+ class UnsupportedProtocolError < RuntimeError
60
+ def message
61
+ "unsupported protocol level(s)"
62
+ end
63
+ end
64
+
65
+ class InvalidHeartBeatHeaderError < RuntimeError
66
+ def message
67
+ "heart-beat header value is malformed"
68
+ end
69
+ end
70
+
71
+ class SubscriptionRequiredError < RuntimeError
72
+ def message
73
+ "a valid subscription id header is required"
74
+ end
75
+ end
76
+
77
+ class UTF8ValidationError < RuntimeError
78
+ def message
79
+ "header is invalid UTF8"
80
+ end
81
+ end
82
+
83
+ class MessageIDRequiredError < RuntimeError
84
+ def message
85
+ "a valid message id is required for ACK/NACK"
86
+ end
87
+ end
88
+
89
+ end # module Error
90
+ end # module Stomp
91
+
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  class ::Hash
2
4
  def uncamelize_and_symbolize_keys
3
5
  self.uncamelize_and_stringify_keys.symbolize_keys
@@ -21,4 +23,4 @@ class ::Hash
21
23
 
22
24
  symbolized
23
25
  end unless self.method_defined?(:symbolize_keys)
24
- end
26
+ end
data/lib/stomp/message.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  module Stomp
2
4
 
3
5
  # Container class for frames, misnamed technically
@@ -6,8 +8,8 @@ module Stomp
6
8
 
7
9
  @@allowed_commands = [ 'CONNECTED', 'MESSAGE', 'RECEIPT', 'ERROR' ]
8
10
 
9
- def initialize(frame)
10
- # p frame
11
+ def initialize(frame, protocol11p = false)
12
+ # p [ "00", frame, frame.encoding ]
11
13
  # Set default empty values
12
14
  self.command = ''
13
15
  self.headers = {}
@@ -34,11 +36,38 @@ module Stomp
34
36
  work_body = frame[headers_index+2..lastnull_index-1]
35
37
  raise Stomp::Error::InvalidFormat, 'nil body' unless work_body
36
38
  # Set the frame values
39
+ if protocol11p
40
+ work_command.force_encoding(Stomp::UTF8) if work_command.respond_to?(:force_encoding)
41
+ end
37
42
  self.command = work_command
38
43
  work_headers.split("\n").map do |value|
39
44
  parsed_value = value.match /^([\w|-]*):(.*)$/
40
45
  raise Stomp::Error::InvalidFormat, 'parsed header value' unless parsed_value
41
- self.headers[parsed_value[1].strip] = parsed_value[2].strip if parsed_value
46
+ #
47
+ pk = parsed_value[1]
48
+ pv = parsed_value[2]
49
+ #
50
+ if protocol11p
51
+ pk.force_encoding(Stomp::UTF8) if pk.respond_to?(:force_encoding)
52
+ pv.force_encoding(Stomp::UTF8) if pv.respond_to?(:force_encoding)
53
+ # Stomp 1.1+ - Servers may put multiple values for a single key on the wire.
54
+ # If so, we support reading those, and passing them to the user.
55
+ if self.headers[pk]
56
+ if self.headers[pk].is_a?(Array) # The 3rd and any subsequent ones for this key
57
+ self.headers[pk] << pv
58
+ else
59
+ # The 2nd one for this key
60
+ tv = self.headers[pk] + ""
61
+ self.headers[pk] = []
62
+ self.headers[pk] << tv << pv
63
+ end
64
+ else
65
+ self.headers[pk] = pv # The 1st one for this key
66
+ end
67
+ else
68
+ # Stomp 1.0
69
+ self.headers[pk.strip] = pv.strip unless self.headers[pk.strip] # Only receive the 1st one
70
+ end
42
71
  end
43
72
 
44
73
  body_length = -1
data/lib/stomp/version.rb CHANGED
@@ -1,8 +1,10 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  module Stomp
2
4
  module Version #:nodoc: all
3
5
  MAJOR = 1
4
- MINOR = 1
5
- PATCH = 10
6
+ MINOR = 2
7
+ PATCH = 0
6
8
  STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
7
9
  end
8
10
  end
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  shared_examples_for "standard Client" do
data/spec/client_spec.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  require 'spec_helper'
2
4
  require 'client_shared_examples'
3
5
 
@@ -1,4 +1,5 @@
1
- # encoding: UTF-8
1
+ # -*- encoding: utf-8 -*-
2
+
2
3
  require 'spec_helper'
3
4
 
4
5
  describe Stomp::Connection do
@@ -9,6 +10,7 @@ describe Stomp::Connection do
9
10
  {:login => "login1", :passcode => "passcode1", :host => "localhost", :port => 61616, :ssl => false},
10
11
  {:login => "login2", :passcode => "passcode2", :host => "remotehost", :port => 61617, :ssl => false}
11
12
  ],
13
+ :reliable => true,
12
14
  :initial_reconnect_delay => 0.01,
13
15
  :max_reconnect_delay => 30.0,
14
16
  :use_exponential_back_off => true,
@@ -16,7 +18,7 @@ describe Stomp::Connection do
16
18
  :max_reconnect_attempts => 0,
17
19
  :randomize => false,
18
20
  :backup => false,
19
- :timeout => -1,
21
+ :connect_timeout => 0,
20
22
  :parse_timeout => 5,
21
23
  :connect_headers => {}
22
24
  }
@@ -42,6 +44,7 @@ describe Stomp::Connection do
42
44
  {:login => "login2", :passcode => "passcode2", :host => "remotehost", :port => 61617, :ssl => false},
43
45
  {:login => "login1", :passcode => "passcode1", :host => "localhost", :port => 61616, :ssl => false}
44
46
  ],
47
+ "reliable" => true,
45
48
  "initialReconnectDelay" => 0.01,
46
49
  "maxReconnectDelay" => 30.0,
47
50
  "useExponentialBackOff" => true,
@@ -49,17 +52,14 @@ describe Stomp::Connection do
49
52
  "maxReconnectAttempts" => 0,
50
53
  "randomize" => false,
51
54
  "backup" => false,
52
- "timeout" => -1,
55
+ "connect_timeout" => 0,
53
56
  "parse_timeout" => 5,
54
57
  }
55
58
 
56
59
  @connection = Stomp::Connection.new(used_hash)
57
60
  @connection.instance_variable_get(:@parameters).should == @parameters
58
61
  end
59
-
60
- it "should be reliable" do
61
- @connection.instance_variable_get(:@reliable).should be_true
62
- end
62
+
63
63
  it "should start with first host in array" do
64
64
  @connection.instance_variable_get(:@host).should == "localhost"
65
65
  end
@@ -74,6 +74,25 @@ describe Stomp::Connection do
74
74
  @connection = Stomp::Connection.new hash
75
75
  @connection.instance_variable_get(:@port).should == 61613
76
76
  end
77
+
78
+ context "should be able pass reliable as part of hash" do
79
+ it "should be false if reliable is set to false" do
80
+ hash = @parameters.merge({:reliable => false })
81
+ connection = Stomp::Connection.new(hash)
82
+ connection.instance_variable_get(:@reliable).should be_false
83
+ end
84
+
85
+ it "should be true if reliable is set to true" do
86
+ hash = @parameters.merge({:reliable => true })
87
+ connection = Stomp::Connection.new(hash)
88
+ connection.instance_variable_get(:@reliable).should be_true
89
+ end
90
+
91
+ it "should be true if reliable is not set" do
92
+ connection = Stomp::Connection.new(@parameters)
93
+ connection.instance_variable_get(:@reliable).should be_true
94
+ end
95
+ end
77
96
 
78
97
  context "when dealing with content-length header" do
79
98
  it "should not suppress it when receiving :suppress_content_length => false" do
@@ -269,6 +288,7 @@ describe Stomp::Connection do
269
288
  # Once connected the host is sent to the end of array
270
289
  {:login => "login1", :passcode => "passcode1", :host => "localhost", :port => 61616, :ssl => false}
271
290
  ],
291
+ :reliable => true,
272
292
  :initial_reconnect_delay => 0.01,
273
293
  :max_reconnect_delay => 30.0,
274
294
  :use_exponential_back_off => true,
@@ -276,7 +296,7 @@ describe Stomp::Connection do
276
296
  :max_reconnect_attempts => 0,
277
297
  :randomize => false,
278
298
  :backup => false,
279
- :timeout => -1,
299
+ :connect_timeout => 0,
280
300
  :parse_timeout => 5,
281
301
  :connect_headers => {}
282
302
  }
@@ -305,7 +325,8 @@ describe Stomp::Connection do
305
325
  :max_reconnect_attempts => 10,
306
326
  :randomize => true,
307
327
  :backup => false,
308
- :timeout => -1,
328
+ :reliable => false,
329
+ :connect_timeout => 0,
309
330
  :parse_timeout => 20,
310
331
  :connect_headers => {:lerolero => "ronaldo"},
311
332
  :dead_letter_queue => "queue/Error",
data/spec/message_spec.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Stomp::Message do
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  require 'rspec'
2
4
  dir = File.dirname(__FILE__)
3
5
  lib_path = File.expand_path("#{dir}/../lib")
data/stomp.gemspec CHANGED
@@ -4,13 +4,13 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{stomp}
8
- s.version = "1.1.10"
7
+ s.name = "stomp"
8
+ s.version = "1.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Brian McCallister", "Marius Mathiesen", "Thiago Morello", "Guy M. Allard"]
12
- s.date = %q{2011-11-07}
13
- s.description = %q{Ruby client for the Stomp messaging protocol}
12
+ s.date = "2011-12-15"
13
+ s.description = "Ruby client for the Stomp messaging protocol. Note that this gem is no longer supported on rubyforge."
14
14
  s.email = ["brianm@apache.org", "marius@stones.com", "morellon@gmail.com", "allard.guy.m@gmail.com"]
15
15
  s.executables = ["catstomp", "stompcat"]
16
16
  s.extra_rdoc_files = [
@@ -24,13 +24,27 @@ Gem::Specification.new do |s|
24
24
  "Rakefile",
25
25
  "bin/catstomp",
26
26
  "bin/stompcat",
27
+ "examples/client11_ex1.rb",
28
+ "examples/client11_putget1.rb",
29
+ "examples/conn11_ex1.rb",
30
+ "examples/conn11_ex2.rb",
31
+ "examples/conn11_hb1.rb",
27
32
  "examples/consumer.rb",
33
+ "examples/get11conn_ex1.rb",
34
+ "examples/get11conn_ex2.rb",
28
35
  "examples/logexamp.rb",
29
36
  "examples/publisher.rb",
37
+ "examples/put11conn_ex1.rb",
38
+ "examples/putget11_rh1.rb",
30
39
  "examples/slogger.rb",
40
+ "examples/stomp11_common.rb",
41
+ "examples/topic_consumer.rb",
42
+ "examples/topic_publisher.rb",
31
43
  "lib/stomp.rb",
32
44
  "lib/stomp/client.rb",
45
+ "lib/stomp/codec.rb",
33
46
  "lib/stomp/connection.rb",
47
+ "lib/stomp/constants.rb",
34
48
  "lib/stomp/errors.rb",
35
49
  "lib/stomp/ext/hash.rb",
36
50
  "lib/stomp/message.rb",
@@ -42,32 +56,19 @@ Gem::Specification.new do |s|
42
56
  "spec/spec_helper.rb",
43
57
  "stomp.gemspec",
44
58
  "test/test_client.rb",
59
+ "test/test_codec.rb",
45
60
  "test/test_connection.rb",
61
+ "test/test_connection1p.rb",
46
62
  "test/test_helper.rb",
47
- "test/test_message.rb"
63
+ "test/test_message.rb",
64
+ "test/tlogger.rb"
48
65
  ]
49
- s.homepage = %q{https://rubygems.org/gems/stomp}
66
+ s.homepage = "https://github.com/morellon/stomp"
50
67
  s.require_paths = ["lib"]
51
- s.rubygems_version = %q{1.3.7}
52
- s.summary = %q{Ruby client for the Stomp messaging protocol}
53
- s.test_files = [
54
- "examples/consumer.rb",
55
- "examples/logexamp.rb",
56
- "examples/publisher.rb",
57
- "examples/slogger.rb",
58
- "spec/client_shared_examples.rb",
59
- "spec/client_spec.rb",
60
- "spec/connection_spec.rb",
61
- "spec/message_spec.rb",
62
- "spec/spec_helper.rb",
63
- "test/test_client.rb",
64
- "test/test_connection.rb",
65
- "test/test_helper.rb",
66
- "test/test_message.rb"
67
- ]
68
+ s.rubygems_version = "1.8.11"
69
+ s.summary = "Ruby client for the Stomp messaging protocol"
68
70
 
69
71
  if s.respond_to? :specification_version then
70
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
71
72
  s.specification_version = 3
72
73
 
73
74
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then