stomper 1.0.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/{spec/spec.opts → .rspec} +0 -2
- data/Gemfile +4 -0
- data/LICENSE +201 -201
- data/README.md +130 -0
- data/Rakefile +5 -0
- data/examples/basic.rb +38 -0
- data/examples/events.rb +54 -0
- data/features/acking_messages.feature +147 -0
- data/features/disconnecting.feature +12 -0
- data/features/establish_connection.feature +44 -0
- data/features/protocol_version_negotiation.feature +61 -0
- data/features/receipts.feature +72 -0
- data/features/scopes.feature +32 -0
- data/features/secure_connections.feature +38 -0
- data/features/send_and_message.feature +28 -0
- data/features/steps/acking_messages_steps.rb +39 -0
- data/features/steps/disconnecting_steps.rb +8 -0
- data/features/steps/establish_connection_steps.rb +74 -0
- data/features/steps/frame_transmission_steps.rb +35 -0
- data/features/steps/protocol_version_negotiation_steps.rb +15 -0
- data/features/steps/receipts_steps.rb +79 -0
- data/features/steps/scopes_steps.rb +52 -0
- data/features/steps/secure_connections_steps.rb +41 -0
- data/features/steps/send_and_message_steps.rb +35 -0
- data/features/steps/subscribing_steps.rb +36 -0
- data/features/steps/threaded_receiver_steps.rb +8 -0
- data/features/steps/transactions_steps.rb +0 -0
- data/features/subscribing.feature +151 -0
- data/features/support/env.rb +11 -0
- data/features/support/header_helpers.rb +12 -0
- data/features/support/ssl/README +6 -0
- data/features/support/ssl/broker_cert.csr +17 -0
- data/features/support/ssl/broker_cert.pem +72 -0
- data/features/support/ssl/broker_key.pem +27 -0
- data/features/support/ssl/client_cert.csr +17 -0
- data/features/support/ssl/client_cert.pem +72 -0
- data/features/support/ssl/client_key.pem +27 -0
- data/features/support/ssl/demoCA/cacert.pem +17 -0
- data/features/support/ssl/demoCA/index.txt +2 -0
- data/features/support/ssl/demoCA/index.txt.attr +1 -0
- data/features/support/ssl/demoCA/index.txt.attr.old +1 -0
- data/features/support/ssl/demoCA/index.txt.old +1 -0
- data/features/support/ssl/demoCA/newcerts/01.pem +72 -0
- data/features/support/ssl/demoCA/newcerts/02.pem +72 -0
- data/features/support/ssl/demoCA/private/cakey.pem +17 -0
- data/features/support/ssl/demoCA/serial +1 -0
- data/features/support/ssl/demoCA/serial.old +1 -0
- data/features/support/test_stomp_server.rb +150 -0
- data/features/threaded_receiver.feature +11 -0
- data/features/transactions.feature +66 -0
- data/lib/stomper.rb +30 -20
- data/lib/stomper/connection.rb +442 -102
- data/lib/stomper/errors.rb +59 -0
- data/lib/stomper/extensions.rb +10 -0
- data/lib/stomper/extensions/common.rb +258 -0
- data/lib/stomper/extensions/events.rb +213 -0
- data/lib/stomper/extensions/heartbeat.rb +101 -0
- data/lib/stomper/extensions/scoping.rb +56 -0
- data/lib/stomper/frame.rb +54 -0
- data/lib/stomper/frame_serializer.rb +217 -0
- data/lib/stomper/headers.rb +15 -0
- data/lib/stomper/receipt_manager.rb +36 -0
- data/lib/stomper/receivers.rb +7 -0
- data/lib/stomper/receivers/threaded.rb +71 -0
- data/lib/stomper/scopes.rb +9 -0
- data/lib/stomper/scopes/header_scope.rb +49 -0
- data/lib/stomper/scopes/receipt_scope.rb +44 -0
- data/lib/stomper/scopes/transaction_scope.rb +109 -0
- data/lib/stomper/sockets.rb +66 -28
- data/lib/stomper/subscription_manager.rb +79 -0
- data/lib/stomper/support.rb +68 -0
- data/lib/stomper/support/1.8/frame_serializer.rb +53 -0
- data/lib/stomper/support/1.8/headers.rb +183 -0
- data/lib/stomper/support/1.9/frame_serializer.rb +64 -0
- data/lib/stomper/support/1.9/headers.rb +172 -0
- data/lib/stomper/support/ruby.rb +13 -0
- data/lib/stomper/uris.rb +49 -0
- data/lib/stomper/version.rb +7 -0
- data/spec/spec_helper.rb +13 -9
- data/spec/stomper/connection_spec.rb +712 -0
- data/spec/stomper/extensions/common_spec.rb +187 -0
- data/spec/stomper/extensions/events_spec.rb +78 -0
- data/spec/stomper/extensions/heartbeat_spec.rb +103 -0
- data/spec/stomper/extensions/scoping_spec.rb +21 -0
- data/spec/stomper/frame_serializer_1.8_spec.rb +318 -0
- data/spec/stomper/frame_serializer_spec.rb +316 -0
- data/spec/stomper/frame_spec.rb +36 -0
- data/spec/stomper/headers_spec.rb +224 -0
- data/spec/stomper/receipt_manager_spec.rb +91 -0
- data/spec/stomper/receivers/threaded_spec.rb +116 -0
- data/spec/stomper/scopes/header_scope_spec.rb +42 -0
- data/spec/stomper/scopes/receipt_scope_spec.rb +51 -0
- data/spec/stomper/scopes/transaction_scope_spec.rb +183 -0
- data/spec/stomper/sockets_spec.rb +113 -0
- data/spec/stomper/subscription_manager_spec.rb +107 -0
- data/spec/stomper/support_spec.rb +69 -0
- data/spec/stomper/uris_spec.rb +54 -0
- data/spec/stomper_spec.rb +9 -0
- data/spec/support/custom_argument_matchers.rb +57 -0
- data/spec/support/existential_frame_matchers.rb +19 -0
- data/spec/support/frame_header_matchers.rb +10 -0
- data/stomper.gemspec +30 -0
- metadata +272 -97
- data/AUTHORS +0 -21
- data/CHANGELOG +0 -20
- data/README.rdoc +0 -120
- data/lib/stomper/client.rb +0 -34
- data/lib/stomper/frame_reader.rb +0 -73
- data/lib/stomper/frame_writer.rb +0 -21
- data/lib/stomper/frames.rb +0 -39
- data/lib/stomper/frames/abort.rb +0 -10
- data/lib/stomper/frames/ack.rb +0 -25
- data/lib/stomper/frames/begin.rb +0 -11
- data/lib/stomper/frames/client_frame.rb +0 -89
- data/lib/stomper/frames/commit.rb +0 -10
- data/lib/stomper/frames/connect.rb +0 -10
- data/lib/stomper/frames/connected.rb +0 -30
- data/lib/stomper/frames/disconnect.rb +0 -10
- data/lib/stomper/frames/error.rb +0 -21
- data/lib/stomper/frames/message.rb +0 -48
- data/lib/stomper/frames/receipt.rb +0 -19
- data/lib/stomper/frames/send.rb +0 -10
- data/lib/stomper/frames/server_frame.rb +0 -38
- data/lib/stomper/frames/subscribe.rb +0 -42
- data/lib/stomper/frames/unsubscribe.rb +0 -19
- data/lib/stomper/open_uri_interface.rb +0 -41
- data/lib/stomper/receipt_handlers.rb +0 -23
- data/lib/stomper/receiptor.rb +0 -38
- data/lib/stomper/subscriber.rb +0 -76
- data/lib/stomper/subscription.rb +0 -128
- data/lib/stomper/subscriptions.rb +0 -95
- data/lib/stomper/threaded_receiver.rb +0 -59
- data/lib/stomper/transaction.rb +0 -185
- data/lib/stomper/transactor.rb +0 -50
- data/lib/stomper/uri.rb +0 -55
- data/spec/client_spec.rb +0 -29
- data/spec/connection_spec.rb +0 -22
- data/spec/frame_reader_spec.rb +0 -37
- data/spec/frame_writer_spec.rb +0 -27
- data/spec/frames/client_frame_spec.rb +0 -66
- data/spec/frames/indirect_frame_spec.rb +0 -45
- data/spec/frames/server_frame_spec.rb +0 -85
- data/spec/open_uri_interface_spec.rb +0 -132
- data/spec/receiptor_spec.rb +0 -35
- data/spec/shared_connection_examples.rb +0 -79
- data/spec/subscriber_spec.rb +0 -77
- data/spec/subscription_spec.rb +0 -157
- data/spec/subscriptions_spec.rb +0 -145
- data/spec/threaded_receiver_spec.rb +0 -33
- data/spec/transaction_spec.rb +0 -139
- data/spec/transactor_spec.rb +0 -46
data/CHANGELOG
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
== 1.0 2010-09-24
|
2
|
-
|
3
|
-
* Major additions to api including open-uri style interface.
|
4
|
-
|
5
|
-
|
6
|
-
== 0.4 2010-04-23
|
7
|
-
|
8
|
-
* Incremented minor version, beginning expansion.
|
9
|
-
* Need to make a list of changes I want to make.
|
10
|
-
|
11
|
-
|
12
|
-
== 0.3 2010-03-04
|
13
|
-
|
14
|
-
* Added sleep to receive loop to prevent it from running "too tightly", not ideal.
|
15
|
-
* Bit of cleanup in response to reek report.
|
16
|
-
|
17
|
-
|
18
|
-
== 0.2 2009-11-20
|
19
|
-
|
20
|
-
* Officially moved to "stomper" library.
|
data/README.rdoc
DELETED
@@ -1,120 +0,0 @@
|
|
1
|
-
=README
|
2
|
-
|
3
|
-
Stomper is a library for connecting to and interacting with a message broker
|
4
|
-
service that supports the Stomp 1.0 Protocol
|
5
|
-
|
6
|
-
@see http://stomp.github.com/stomp-specification-1-0.html Stomp 1.0 Specification
|
7
|
-
|
8
|
-
|
9
|
-
== OpenURI Example Usage
|
10
|
-
|
11
|
-
# A contrived example: Send two messages, receive them back
|
12
|
-
open("stomp://localhost/queue/testing") do |s|
|
13
|
-
s.puts "Hello World"
|
14
|
-
s.write "You may disagree, but I find this useful!"
|
15
|
-
messages = s.first(2) # => [ Message("Hello World"), Message("You may disagree...") ]
|
16
|
-
end
|
17
|
-
|
18
|
-
# Another example: connect, send a message to a destination and disconnect
|
19
|
-
open("stomp://localhost/topic/whatever") do |s|
|
20
|
-
s.put "PING!"
|
21
|
-
end
|
22
|
-
|
23
|
-
# Another example: connect, subscribe and process indefinitely
|
24
|
-
open("stomp://localhost/queue/worker") do |s|
|
25
|
-
s.each do |m|
|
26
|
-
logger.info "Received a message: #{m.body}"
|
27
|
-
# Do important work based on message
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
# Final example: connect, get a single message, and disconnect
|
32
|
-
open("stomp+ssl://localhost/queue/odd_jobs") do |s|
|
33
|
-
# you can use get, gets, read or first, they're all the same at
|
34
|
-
# this time and for the foreseeable future.
|
35
|
-
incoming_message = s.get
|
36
|
-
# Do some work on incoming_message
|
37
|
-
end
|
38
|
-
|
39
|
-
This interface has been a goal of mine for this library for some time now. I
|
40
|
-
understand the value in a more typical socket object approach, and to that end
|
41
|
-
the client interface still exists (albeit there's been quite a lot of refractoring.)
|
42
|
-
However,
|
43
|
-
|
44
|
-
stomp = Stomper::Connection.new("stomp://localhost/")
|
45
|
-
stomp.subscribe("/queue/blather") do |m|
|
46
|
-
# ...
|
47
|
-
end
|
48
|
-
stomp.send("/topic/other", "Hello")
|
49
|
-
|
50
|
-
just doesn't feel very Ruby-esque to me. While the two methods for interacting with
|
51
|
-
Stomper connections appear very different, +s+ in the OpenURI examples above
|
52
|
-
really is a Stomper::Connection, but with some added extensions for handling
|
53
|
-
+put+, +get+, +each+, and so forth. One note: +read+, +get+ and +gets+ are
|
54
|
-
all aliases for +first+. Similarly, +puts+ is an alias for +put+. However,
|
55
|
-
+write+ is slightly different. The message broker I most often use the
|
56
|
-
STOMP protocol with is Apache ActiveMQ which, at the time of this writing, uses
|
57
|
-
the absence or presence of a `content-length` header to discriminate between a
|
58
|
-
JMS TextMessage and a BytesMessage. The +put+ and +puts+ methods will force
|
59
|
-
Stomper to omit that header, while +write+ will force its presence.
|
60
|
-
|
61
|
-
== Example Usage
|
62
|
-
|
63
|
-
client = Stomper::Client.new("stomp://my_username:s3cr3tz@localhost:61613")
|
64
|
-
# Clients must be explicitly started to automatically receive incoming
|
65
|
-
# messages.
|
66
|
-
client.start
|
67
|
-
|
68
|
-
client.subscribe("/queue/hello") do |msg|
|
69
|
-
puts msg.body
|
70
|
-
end
|
71
|
-
|
72
|
-
# Send a simple message
|
73
|
-
client.send("/queue/hello", "hello world!")
|
74
|
-
|
75
|
-
# Send a message within a transaction. This usage is new to stomper
|
76
|
-
# however, one can manually manage transactions as well.
|
77
|
-
client.transaction do |t|
|
78
|
-
t.send("/queue/hello", "a transactioned message")
|
79
|
-
end
|
80
|
-
|
81
|
-
# If the block provided to #transaction accepts a single parameter,
|
82
|
-
# the client yields the Transaction object to the block, otherwise
|
83
|
-
# the block is instance_eval'd within the Transaction object.
|
84
|
-
client.transaction do
|
85
|
-
send("/queue/hello", "a message you will never receive")
|
86
|
-
# Nested transactions, failures percolate up to parent transactions.
|
87
|
-
transaction do
|
88
|
-
send("/queue/hello", "because I am about to fail!")
|
89
|
-
raise "by forcing an error in a nested transaction"
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
# Later ...
|
94
|
-
client.stop
|
95
|
-
client.close
|
96
|
-
|
97
|
-
== To-Do
|
98
|
-
* Provide other methods for handling the receiver.
|
99
|
-
* Provide the `pipe` method on Stomper::Client
|
100
|
-
* Allow SSL verification if requested (option :verify_ssl?)
|
101
|
-
* Re-evaluate how to handle a 'reliable' connection.
|
102
|
-
|
103
|
-
== License
|
104
|
-
|
105
|
-
Stomper is released under the Apache License 2.0
|
106
|
-
|
107
|
-
== Pointless Backstory
|
108
|
-
|
109
|
-
Stomper began its life as a mere fork of the stomp gem.
|
110
|
-
However, as changes were made and desires grew, the fork began breaking
|
111
|
-
API compatibility with the original gem, and thus Stomper was conceived.
|
112
|
-
|
113
|
-
@see http://github.com/js/stomp Stomp
|
114
|
-
|
115
|
-
== Other Stuff
|
116
|
-
|
117
|
-
Primary Author:: Ian D. Eccles
|
118
|
-
Source Repository:: http://github.com/iande/stomper
|
119
|
-
Current Version:: 1.0.0
|
120
|
-
Last Updated:: 2010-09-25
|
data/lib/stomper/client.rb
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
module Stomper
|
2
|
-
module Client
|
3
|
-
# Sends a string message specified by +body+ to the appropriate stomp
|
4
|
-
# broker destination given by +destination+. Additional headers for the
|
5
|
-
# message may be specified by the +headers+ hash where the key is the header
|
6
|
-
# property and the value is the corresponding property's value. The
|
7
|
-
# keys of +headers+ may be symbols or strings.
|
8
|
-
#
|
9
|
-
# Examples:
|
10
|
-
#
|
11
|
-
# client.send("/topic/whatever", "hello world")
|
12
|
-
#
|
13
|
-
# client.send("/queue/some/destination", "hello world", { :persistent => true })
|
14
|
-
#
|
15
|
-
def send(destination, body, headers={})
|
16
|
-
transmit(Stomper::Frames::Send.new(destination, body, headers))
|
17
|
-
end
|
18
|
-
|
19
|
-
# Acknowledge to the stomp broker that a given message was received.
|
20
|
-
# The +id_or_frame+ parameter may be either the message-id header of
|
21
|
-
# the received message, or an actual instance of Stomper::Frames::Message.
|
22
|
-
# Additional headers may be specified through the +headers+ hash.
|
23
|
-
#
|
24
|
-
# Examples:
|
25
|
-
#
|
26
|
-
# client.ack(received_message)
|
27
|
-
#
|
28
|
-
# client.ack("message-0001-00451-003031")
|
29
|
-
#
|
30
|
-
def ack(id_or_frame, headers={})
|
31
|
-
transmit(Stomper::Frames::Ack.ack_for(id_or_frame, headers))
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
data/lib/stomper/frame_reader.rb
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
module Stomper
|
2
|
-
# Deserializes Stomp Frames from an input stream.
|
3
|
-
# Any object that responds appropriately to +getc+, +gets+
|
4
|
-
# and +read+ can be used as the input stream.
|
5
|
-
module FrameReader
|
6
|
-
# Receives the next Stomp Frame from the socket stream
|
7
|
-
def receive_frame
|
8
|
-
command = read_command
|
9
|
-
headers = read_headers
|
10
|
-
body = read_body(headers[:'content-length'])
|
11
|
-
Stomper::Frames::ServerFrame.build(command, headers, body)
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
def read_command
|
16
|
-
command = ''
|
17
|
-
while(command.size == 0)
|
18
|
-
command = gets(Stomper::Frames::LINE_DELIMITER).chomp!
|
19
|
-
end
|
20
|
-
command
|
21
|
-
end
|
22
|
-
|
23
|
-
def read_headers
|
24
|
-
headers = {}
|
25
|
-
loop do
|
26
|
-
line = gets(Stomper::Frames::LINE_DELIMITER).chomp!
|
27
|
-
break if line.size == 0
|
28
|
-
if (delim = line.index(':'))
|
29
|
-
headers[ line[0..(delim-1)].to_sym ] = line[(delim+1)..-1]
|
30
|
-
end
|
31
|
-
end
|
32
|
-
headers
|
33
|
-
end
|
34
|
-
|
35
|
-
def read_body(body_len)
|
36
|
-
body_len &&= body_len.strip.to_i
|
37
|
-
if body_len
|
38
|
-
read_fixed_body(body_len)
|
39
|
-
else
|
40
|
-
read_null_terminated_body
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def read_null_terminated_body
|
45
|
-
body = ''
|
46
|
-
while next_byte = get_body_byte
|
47
|
-
body << next_byte.chr
|
48
|
-
end
|
49
|
-
body
|
50
|
-
end
|
51
|
-
|
52
|
-
def read_fixed_body(num_bytes)
|
53
|
-
body = read(num_bytes)
|
54
|
-
raise MalformedFrameError if get_body_byte
|
55
|
-
body
|
56
|
-
end
|
57
|
-
|
58
|
-
def get_body_byte
|
59
|
-
next_byte = get_ord
|
60
|
-
(next_byte == Stomper::Frames::TERMINATOR) ? nil : next_byte
|
61
|
-
end
|
62
|
-
|
63
|
-
if String.method_defined?(:ord)
|
64
|
-
def get_ord
|
65
|
-
getc.ord
|
66
|
-
end
|
67
|
-
else
|
68
|
-
def get_ord
|
69
|
-
getc
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
data/lib/stomper/frame_writer.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
module Stomper
|
2
|
-
# Serializes Stomp Frames to an output stream.
|
3
|
-
# Any object that responds appropriately to +write+
|
4
|
-
# can be used as the input stream.
|
5
|
-
module FrameWriter
|
6
|
-
# Writes a Stomp Frame to the underlying output stream.
|
7
|
-
def transmit_frame(frame)
|
8
|
-
write([ frame.command, Stomper::Frames::LINE_DELIMITER,
|
9
|
-
serialize_headers(frame.headers), Stomper::Frames::LINE_DELIMITER,
|
10
|
-
frame.body, Stomper::Frames::TERMINATOR.chr].join)
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
def serialize_headers(headers)
|
15
|
-
headers.inject("") do |acc, (key, val)|
|
16
|
-
acc << "#{key}#{Stomper::Frames::HEADER_DELIMITER}#{val}#{Stomper::Frames::LINE_DELIMITER}"
|
17
|
-
acc
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
data/lib/stomper/frames.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
module Stomper
|
2
|
-
# This module holds all known encapsulations of
|
3
|
-
# frames that are part of the Stomp Protocol specification.
|
4
|
-
module Frames
|
5
|
-
HEADER_DELIMITER = ':'
|
6
|
-
TERMINATOR = 0
|
7
|
-
LINE_DELIMITER = "\n"
|
8
|
-
|
9
|
-
class IndirectFrame #:nodoc:
|
10
|
-
attr_reader :headers, :body
|
11
|
-
|
12
|
-
def initialize(headers={}, body=nil, command=nil)
|
13
|
-
@command = command && command.to_s.upcase
|
14
|
-
@headers = headers.dup
|
15
|
-
@body = body
|
16
|
-
end
|
17
|
-
|
18
|
-
def command
|
19
|
-
@command ||= self.class.name.split("::").last.upcase
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
require 'stomper/frames/client_frame'
|
26
|
-
require 'stomper/frames/server_frame'
|
27
|
-
require 'stomper/frames/abort'
|
28
|
-
require 'stomper/frames/ack'
|
29
|
-
require 'stomper/frames/begin'
|
30
|
-
require 'stomper/frames/commit'
|
31
|
-
require 'stomper/frames/connect'
|
32
|
-
require 'stomper/frames/connected'
|
33
|
-
require 'stomper/frames/disconnect'
|
34
|
-
require 'stomper/frames/error'
|
35
|
-
require 'stomper/frames/message'
|
36
|
-
require 'stomper/frames/receipt'
|
37
|
-
require 'stomper/frames/send'
|
38
|
-
require 'stomper/frames/subscribe'
|
39
|
-
require 'stomper/frames/unsubscribe'
|
data/lib/stomper/frames/abort.rb
DELETED
data/lib/stomper/frames/ack.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
module Stomper
|
2
|
-
module Frames
|
3
|
-
# Encapsulates an "ACK" frame from the Stomp Protocol.
|
4
|
-
class Ack < Stomper::Frames::ClientFrame
|
5
|
-
def initialize(message_id, headers={})
|
6
|
-
super(headers.merge({ :'message-id' => message_id }))
|
7
|
-
end
|
8
|
-
|
9
|
-
# Creates a new Ack instance that corresponds to an acknowledgement
|
10
|
-
# of the supplied +message+, with any additional +headers+. The
|
11
|
-
# +message+ parameter may be an instance of Stomper::Frames::Message, or
|
12
|
-
# a message id. If +message+ is an instance of Stomper::Frames::Message
|
13
|
-
# and was exchanged as part of a transaction, the transaction header from
|
14
|
-
# +message+ will be injected into the newly created Ack object's headers.
|
15
|
-
def self.ack_for(message, headers = {})
|
16
|
-
if message.is_a?(Message)
|
17
|
-
headers[:transaction] = message.headers[:transaction] if message.headers[:transaction]
|
18
|
-
new(message.id, headers)
|
19
|
-
else
|
20
|
-
new(message.to_s)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/lib/stomper/frames/begin.rb
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
module Stomper
|
2
|
-
module Frames
|
3
|
-
# Encapsulates a "BEGIN" frame from the Stomp Protocol.
|
4
|
-
class Begin < Stomper::Frames::ClientFrame
|
5
|
-
def initialize(transaction_id, headers={})
|
6
|
-
super(headers.merge(:transaction => transaction_id))
|
7
|
-
@headers[:transaction] = transaction_id
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
@@ -1,89 +0,0 @@
|
|
1
|
-
module Stomper
|
2
|
-
module Frames
|
3
|
-
# Encapsulates a client side frame for the Stomp Protocol.
|
4
|
-
class ClientFrame < IndirectFrame
|
5
|
-
|
6
|
-
# Creates a new ClientFrame instance with the specified +command+,
|
7
|
-
# +headers+ and +body+.
|
8
|
-
# If +headers+ includes a key of :generate_content_length, the
|
9
|
-
# associated value will determine if a 'content-length' header is automatically
|
10
|
-
# generated for this particular frame instance. This key can be
|
11
|
-
# specified in the +headers+ parameter of any of the subclasses of ClientFrame,
|
12
|
-
# and it will be interpretted in the same fashion.
|
13
|
-
def initialize(headers={}, body=nil, command = nil)
|
14
|
-
@generate_content_length = headers.delete(:generate_content_length)
|
15
|
-
super(headers, body, command)
|
16
|
-
end
|
17
|
-
|
18
|
-
# If +bool+ is false or nil, this frame instance will not attempt to
|
19
|
-
# automatically generate a content-length header. This is useful when
|
20
|
-
# dealing with ActiveMQ as a stomp message broker, which will treat incoming
|
21
|
-
# messages lacking a content-length header as +TextMessage+s and
|
22
|
-
# +BytesMessage+s if the header is present. For more information see:
|
23
|
-
# {Apache ActiveMQ - Stomp}[http://activemq.apache.org/stomp.html]
|
24
|
-
def generate_content_length=(bool)
|
25
|
-
@generate_content_length=bool
|
26
|
-
end
|
27
|
-
|
28
|
-
# If generate_content_length= has been called on this instance, then the
|
29
|
-
# value supplied there is returned here. Otherwise, we defer to the
|
30
|
-
# class method of the same name.
|
31
|
-
def generate_content_length?
|
32
|
-
@generate_content_length.nil? ? self.class.generate_content_length? : @generate_content_length
|
33
|
-
end
|
34
|
-
|
35
|
-
|
36
|
-
# Returns the headers for this frame, including a +content-length+ header
|
37
|
-
# set to the size of the current body, if +generate_content_length?+ is
|
38
|
-
# not false.
|
39
|
-
def headers
|
40
|
-
if generate_content_length? && @body && !@body.empty?
|
41
|
-
@headers[:'content-length'] ||= body_size
|
42
|
-
end
|
43
|
-
@headers
|
44
|
-
end
|
45
|
-
|
46
|
-
class << self
|
47
|
-
# Sets a class level setting for determining if a content-length header
|
48
|
-
# should automatically be generated.
|
49
|
-
def generate_content_length=(bool)
|
50
|
-
@generate_content_length = bool
|
51
|
-
end
|
52
|
-
|
53
|
-
# Returns the value passed to the class level generate_content_length=
|
54
|
-
# method, or true if no value has been set (thus, defaults to true.)
|
55
|
-
#
|
56
|
-
# The precedence for resolving whether or not a content-length header
|
57
|
-
# is generated by the +headers+ method is:
|
58
|
-
# check the instance setting,
|
59
|
-
# if it has not been set, defer to the class setting, if it hasn't
|
60
|
-
# been set, default to true.
|
61
|
-
def generate_content_length?
|
62
|
-
if @generate_content_length.nil?
|
63
|
-
@generate_content_length = true
|
64
|
-
end
|
65
|
-
@generate_content_length
|
66
|
-
end
|
67
|
-
|
68
|
-
def inherited(client_frame) #:nodoc:
|
69
|
-
declared_frames << { :class => client_frame, :command => client_frame.name.split("::").last.downcase.to_sym }
|
70
|
-
end
|
71
|
-
|
72
|
-
def declared_frames
|
73
|
-
@declared_frames ||= []
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
private
|
78
|
-
if String.method_defined?(:bytesize)
|
79
|
-
def body_size
|
80
|
-
@body.bytesize
|
81
|
-
end
|
82
|
-
else
|
83
|
-
def body_size
|
84
|
-
@body.size
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|