qpid_proton 0.18.1 → 0.19.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.
- checksums.yaml +4 -4
- data/ext/cproton/cproton.c +863 -75
- data/lib/codec/data.rb +589 -815
- data/lib/codec/mapping.rb +142 -126
- data/lib/core/condition.rb +89 -0
- data/lib/core/connection.rb +188 -228
- data/lib/core/connection_driver.rb +202 -0
- data/lib/core/container.rb +366 -0
- data/lib/core/delivery.rb +76 -251
- data/lib/core/disposition.rb +21 -35
- data/lib/core/endpoint.rb +21 -53
- data/lib/core/event.rb +156 -0
- data/lib/core/exceptions.rb +109 -106
- data/lib/core/link.rb +24 -49
- data/lib/core/listener.rb +82 -0
- data/lib/core/message.rb +59 -155
- data/lib/core/messaging_handler.rb +190 -0
- data/lib/core/receiver.rb +38 -7
- data/lib/core/sasl.rb +43 -46
- data/lib/core/sender.rb +55 -32
- data/lib/core/session.rb +58 -58
- data/lib/core/ssl.rb +5 -13
- data/lib/core/ssl_details.rb +1 -2
- data/lib/core/ssl_domain.rb +5 -8
- data/lib/core/terminus.rb +62 -30
- data/lib/core/tracker.rb +45 -0
- data/lib/core/transfer.rb +121 -0
- data/lib/core/transport.rb +62 -97
- data/lib/core/uri.rb +73 -0
- data/lib/core/url.rb +11 -7
- data/lib/handler/adapter.rb +78 -0
- data/lib/handler/messaging_adapter.rb +127 -0
- data/lib/handler/messaging_handler.rb +128 -178
- data/lib/handler/reactor_messaging_adapter.rb +158 -0
- data/lib/messenger/messenger.rb +9 -8
- data/lib/messenger/subscription.rb +1 -2
- data/lib/messenger/tracker.rb +1 -2
- data/lib/messenger/tracker_status.rb +1 -2
- data/lib/qpid_proton.rb +36 -66
- data/lib/reactor/container.rb +40 -234
- data/lib/types/array.rb +73 -130
- data/lib/types/described.rb +2 -44
- data/lib/types/hash.rb +19 -56
- data/lib/types/strings.rb +1 -2
- data/lib/types/type.rb +68 -0
- data/lib/util/{handler.rb → deprecation.rb} +22 -15
- data/lib/util/error_handler.rb +4 -25
- data/lib/util/timeout.rb +1 -2
- data/lib/util/version.rb +1 -2
- data/lib/util/wrapper.rb +58 -38
- metadata +16 -33
- data/lib/core/base_handler.rb +0 -31
- data/lib/core/selectable.rb +0 -130
- data/lib/event/collector.rb +0 -148
- data/lib/event/event.rb +0 -318
- data/lib/event/event_base.rb +0 -91
- data/lib/event/event_type.rb +0 -71
- data/lib/handler/acking.rb +0 -70
- data/lib/handler/c_adaptor.rb +0 -47
- data/lib/handler/c_flow_controller.rb +0 -33
- data/lib/handler/endpoint_state_handler.rb +0 -217
- data/lib/handler/incoming_message_handler.rb +0 -74
- data/lib/handler/outgoing_message_handler.rb +0 -100
- data/lib/handler/wrapped_handler.rb +0 -76
- data/lib/reactor/acceptor.rb +0 -41
- data/lib/reactor/backoff.rb +0 -41
- data/lib/reactor/connector.rb +0 -115
- data/lib/reactor/global_overrides.rb +0 -44
- data/lib/reactor/link_option.rb +0 -90
- data/lib/reactor/reactor.rb +0 -196
- data/lib/reactor/session_per_connection.rb +0 -45
- data/lib/reactor/ssl_config.rb +0 -41
- data/lib/reactor/task.rb +0 -39
- data/lib/reactor/urls.rb +0 -45
- data/lib/util/class_wrapper.rb +0 -54
- data/lib/util/condition.rb +0 -47
- data/lib/util/constants.rb +0 -85
- data/lib/util/engine.rb +0 -82
- data/lib/util/reactor.rb +0 -32
- data/lib/util/swig_helper.rb +0 -114
- data/lib/util/uuid.rb +0 -32
data/lib/core/tracker.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# Licensed to the Apache Software Foundation (ASF) under one
|
2
|
+
# or more contributor license agreements. See the NOTICE file
|
3
|
+
# distributed with this work for additional information
|
4
|
+
# regarding copyright ownership. The ASF licenses this file
|
5
|
+
# to you under the Apache License, Version 2.0 (the
|
6
|
+
# "License"); you may not use this file except in compliance
|
7
|
+
# with the License. You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing,
|
12
|
+
# software distributed under the License is distributed on an
|
13
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
14
|
+
# KIND, either express or implied. See the License for the
|
15
|
+
# specific language governing permissions and limitations
|
16
|
+
# under the License.
|
17
|
+
|
18
|
+
|
19
|
+
module Qpid::Proton
|
20
|
+
|
21
|
+
# Track the {Transfer::State} of a sent message.
|
22
|
+
class Tracker < Transfer
|
23
|
+
# @return [Sender] The parent {Sender} link.
|
24
|
+
def sender() link; end
|
25
|
+
|
26
|
+
# Re-delivery modifications sent by the receiver in {Delivery#release}
|
27
|
+
# @return [Hash] See the {Delivery#release} +opts+ parameter.
|
28
|
+
# @return [nil] If no modifications were requested by the receiver.
|
29
|
+
def modifications()
|
30
|
+
return nil if (state != MODIFIED)
|
31
|
+
d = Cproton.pn_delivery_remote(@impl)
|
32
|
+
{
|
33
|
+
:failed => Cproton.pn_disposition_is_failed(d),
|
34
|
+
:undeliverable => Cproton.pn_disposition_is_undeliverable(d),
|
35
|
+
:annotations => Codec::Data.to_object(Cproton.pn_disposition_annotations(d))
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
# Abort a partially-sent message.
|
40
|
+
# The tracker can no longer be used after calling {#abort}.
|
41
|
+
def abort()
|
42
|
+
Cproton.pn_delivery_abort(@impl)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
# Licensed to the Apache Software Foundation (ASF) under one
|
2
|
+
# or more contributor license agreements. See the NOTICE file
|
3
|
+
# distributed with this work for additional information
|
4
|
+
# regarding copyright ownership. The ASF licenses this file
|
5
|
+
# to you under the Apache License, Version 2.0 (the
|
6
|
+
# "License"); you may not use this file except in compliance
|
7
|
+
# with the License. You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing,
|
12
|
+
# software distributed under the License is distributed on an
|
13
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
14
|
+
# KIND, either express or implied. See the License for the
|
15
|
+
# specific language governing permissions and limitations
|
16
|
+
# under the License.
|
17
|
+
|
18
|
+
|
19
|
+
module Qpid::Proton
|
20
|
+
|
21
|
+
# Status of a message transfer on a {Link}
|
22
|
+
# Common base class for {Tracker} and {Delivery}.
|
23
|
+
class Transfer
|
24
|
+
include Util::Deprecation
|
25
|
+
|
26
|
+
# @!private
|
27
|
+
PROTON_METHOD_PREFIX = "pn_delivery"
|
28
|
+
# @!private
|
29
|
+
include Util::Wrapper
|
30
|
+
|
31
|
+
def self.wrap(impl)
|
32
|
+
return unless impl
|
33
|
+
self.fetch_instance(impl, :pn_delivery_attachments) ||
|
34
|
+
(Cproton.pn_link_is_sender(Cproton.pn_delivery_link(impl)) ? Tracker : Delivery).new(impl)
|
35
|
+
end
|
36
|
+
|
37
|
+
def initialize(impl)
|
38
|
+
@impl = impl
|
39
|
+
@inspect = nil
|
40
|
+
self.class.store_instance(self, :pn_delivery_attachments)
|
41
|
+
end
|
42
|
+
|
43
|
+
public
|
44
|
+
|
45
|
+
# AMQP Delivery States describing the outcome of a message transfer
|
46
|
+
module State
|
47
|
+
# Message was successfully processed by the receiver
|
48
|
+
ACCEPTED = Cproton::PN_ACCEPTED
|
49
|
+
|
50
|
+
# Message rejected as invalid and unprocessable by the receiver.
|
51
|
+
REJECTED = Cproton::PN_REJECTED
|
52
|
+
|
53
|
+
# Message was not (and will not be) processed by the receiver, but may be
|
54
|
+
# acceptable if re-delivered to another receiver
|
55
|
+
RELEASED = Cproton::PN_RELEASED
|
56
|
+
|
57
|
+
# Like {RELEASED}, but there are modifications (see {Tracker#modifications})
|
58
|
+
# that must be applied to the message by the {Sender} before re-delivering it.
|
59
|
+
MODIFIED = Cproton::PN_MODIFIED
|
60
|
+
|
61
|
+
# Partial message data received. Only used during link recovery.
|
62
|
+
RECEIVED = Cproton::PN_RECEIVED
|
63
|
+
end
|
64
|
+
|
65
|
+
include State
|
66
|
+
|
67
|
+
# @return [String] Unique ID for the transfer in the context of the {#link}
|
68
|
+
def id() Cproton.pn_delivery_tag(@impl); end
|
69
|
+
|
70
|
+
# @deprecated use {#id}
|
71
|
+
deprecated_alias :tag, :id
|
72
|
+
|
73
|
+
# @return [Boolean] True if the transfer has is remotely settled.
|
74
|
+
proton_caller :settled?
|
75
|
+
|
76
|
+
# @return [Integer] Remote state of the transfer, one of the values in {State}
|
77
|
+
def state() Cproton.pn_delivery_remote_state(@impl); end
|
78
|
+
|
79
|
+
# @return [Link] The parent link.
|
80
|
+
def link() Link.wrap(Cproton.pn_delivery_link(@impl)); end
|
81
|
+
|
82
|
+
# @return [Session] The parent session.
|
83
|
+
def session() link.session; end
|
84
|
+
|
85
|
+
# @return [Connection] The parent connection.
|
86
|
+
def connection() self.session.connection; end
|
87
|
+
|
88
|
+
# @return [Transport] The parent connection's transport.
|
89
|
+
def transport() self.connection.transport; end
|
90
|
+
|
91
|
+
# @deprecated internal use only
|
92
|
+
proton_caller :writable?
|
93
|
+
# @deprecated internal use only
|
94
|
+
proton_caller :readable?
|
95
|
+
# @deprecated internal use only
|
96
|
+
proton_caller :updated?
|
97
|
+
# @deprecated internal use only
|
98
|
+
proton_caller :clear
|
99
|
+
# @deprecated internal use only
|
100
|
+
proton_caller :pending
|
101
|
+
# @deprecated internal use only
|
102
|
+
proton_caller :partial?
|
103
|
+
# @deprecated internal use only
|
104
|
+
def update(state) Cproton.pn_delivery_update(@impl, state); end
|
105
|
+
# @deprecated internal use only
|
106
|
+
proton_caller :buffered?
|
107
|
+
# @deprecated internal use only
|
108
|
+
def local_state() Cproton.pn_delivery_local_state(@impl); end
|
109
|
+
# @deprecated use {#state}
|
110
|
+
deprecated_alias :remote_state, :state
|
111
|
+
# @deprecated internal use only
|
112
|
+
def settle(state = nil)
|
113
|
+
update(state) unless state.nil?
|
114
|
+
Cproton.pn_delivery_settle(@impl)
|
115
|
+
@inspect = inspect # Save the inspect string, the delivery pointer will go bad.
|
116
|
+
end
|
117
|
+
|
118
|
+
def inspect() @inspect || super; end
|
119
|
+
def to_s() inspect; end
|
120
|
+
end
|
121
|
+
end
|
data/lib/core/transport.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
#--
|
2
1
|
# Licensed to the Apache Software Foundation (ASF) under one
|
3
2
|
# or more contributor license agreements. See the NOTICE file
|
4
3
|
# distributed with this work for additional information
|
@@ -15,57 +14,18 @@
|
|
15
14
|
# KIND, either express or implied. See the License for the
|
16
15
|
# specific language governing permissions and limitations
|
17
16
|
# under the License.
|
18
|
-
|
17
|
+
|
19
18
|
|
20
19
|
module Qpid::Proton
|
21
20
|
|
22
|
-
#
|
23
|
-
#
|
24
|
-
# A transport is associated with, at most, one Connection.
|
25
|
-
#
|
26
|
-
# == Client And Server Mode
|
27
|
-
#
|
28
|
-
# Initially, a transport is configured to be a client tranpsort. It can be
|
29
|
-
# configured to act as a server when it is created.
|
30
|
-
#
|
31
|
-
# A client transport initiates outgoing connections.
|
32
|
-
#
|
33
|
-
# A client transport must be configured with the protocol layers to use and
|
34
|
-
# cannot configure itself automatically.
|
35
|
-
#
|
36
|
-
# A server transport accepts incoming connections. It can automatically
|
37
|
-
# configure itself to include the various protocol layers depending on the
|
38
|
-
# incoming protocol headers.
|
39
|
-
#
|
40
|
-
# == Tracing Data
|
41
|
-
#
|
42
|
-
# Data can be traced into and out of the transport programmatically by setting
|
43
|
-
# the #trace level to one of the defined trace values (TRACE_RAW, TRACE_FRM or
|
44
|
-
# TRACE_DRV). Tracing can also be turned off programmatically by setting the
|
45
|
-
# #trace level to TRACE_OFF.
|
46
|
-
#
|
47
|
-
# @example
|
48
|
-
#
|
49
|
-
# # turns on frame tracing
|
50
|
-
# @transport.trace = Qpid::Proton::Transport::TRACE_FRM
|
51
|
-
#
|
52
|
-
# # ... do something where the frames are of interest, such as debugging
|
53
|
-
#
|
54
|
-
# # turn tracing off again
|
55
|
-
# @transport.trace = Qpid::Proton::Transport::TRACE_NONE
|
56
|
-
#
|
57
|
-
# Tracing can also be enabled from the command line by defining the similarly
|
58
|
-
# named environment variable before starting a Proton application:
|
59
|
-
#
|
60
|
-
# @example
|
61
|
-
#
|
62
|
-
# # enable tracing from the command line
|
63
|
-
# PN_TRACE_FRM=1 ruby my_proton_app.rb
|
64
|
-
#
|
21
|
+
# @deprecated all important features are available from {#Connection}
|
65
22
|
class Transport
|
23
|
+
include Util::Deprecation
|
66
24
|
|
67
25
|
# @private
|
68
|
-
|
26
|
+
PROTON_METHOD_PREFIX = "pn_transport"
|
27
|
+
# @private
|
28
|
+
include Util::Wrapper
|
69
29
|
|
70
30
|
# Turn logging off entirely.
|
71
31
|
TRACE_OFF = Cproton::PN_TRACE_OFF
|
@@ -76,22 +36,13 @@ module Qpid::Proton
|
|
76
36
|
# Log driver related events; i.e., initialization, end of stream, etc.
|
77
37
|
TRACE_DRV = Cproton::PN_TRACE_DRV
|
78
38
|
|
79
|
-
|
80
|
-
CLIENT = 1
|
81
|
-
# @private
|
82
|
-
SERVER = 2
|
83
|
-
|
84
|
-
# @private
|
85
|
-
include Util::SwigHelper
|
86
|
-
|
87
|
-
# @private
|
88
|
-
PROTON_METHOD_PREFIX = "pn_transport"
|
39
|
+
proton_get :user
|
89
40
|
|
90
41
|
# @!attribute channel_max
|
91
42
|
#
|
92
43
|
# @return [Integer] The maximum allowed channel.
|
93
44
|
#
|
94
|
-
|
45
|
+
proton_set_get :channel_max
|
95
46
|
|
96
47
|
# @!attribute [r] remote_channel_max
|
97
48
|
#
|
@@ -102,26 +53,34 @@ module Qpid::Proton
|
|
102
53
|
# @!attribute max_frame_size
|
103
54
|
#
|
104
55
|
# @return [Integer] The maximum frame size.
|
105
|
-
|
106
|
-
|
56
|
+
proton_set_get :max_frame
|
57
|
+
proton_get :remote_max_frame
|
107
58
|
|
108
59
|
# @!attribute [r] remote_max_frame_size
|
109
60
|
#
|
110
61
|
# @return [Integer] The maximum frame size of the transport's remote peer.
|
111
62
|
#
|
112
|
-
|
63
|
+
proton_get :remote_max_frame_size
|
113
64
|
|
114
65
|
# @!attribute idle_timeout
|
115
66
|
#
|
116
|
-
# @
|
67
|
+
# @deprecated use {Connection#open} with the +:idle_timeout+ option to set
|
68
|
+
# the timeout, and {Connection#idle_timeout} to query the remote timeout.
|
69
|
+
#
|
70
|
+
# The Connection timeout values are in *seconds* and are automatically
|
71
|
+
# converted.
|
72
|
+
#
|
73
|
+
# @return [Integer] The idle timeout in *milliseconds*.
|
117
74
|
#
|
118
|
-
|
75
|
+
proton_set_get :idle_timeout
|
119
76
|
|
120
|
-
# @!attribute [r] remote_idle_timeout
|
77
|
+
# @!attribute [r] remote_idle_timeout in milliseconds
|
78
|
+
#
|
79
|
+
# @deprecated Use {Connection#idle_timeout} to query the remote timeout.
|
121
80
|
#
|
122
81
|
# @return [Integer] The idle timeout for the transport's remote peer.
|
123
82
|
#
|
124
|
-
|
83
|
+
proton_set_get :remote_idle_timeout
|
125
84
|
|
126
85
|
# @!attribute [r] capacity
|
127
86
|
#
|
@@ -190,49 +149,34 @@ module Qpid::Proton
|
|
190
149
|
#
|
191
150
|
# @return [Integer] The number of frames output by a transport.
|
192
151
|
#
|
193
|
-
|
152
|
+
proton_get :frames_output
|
194
153
|
|
195
154
|
# @!attribute [r] frames_input
|
196
155
|
#
|
197
156
|
# @return [Integer] The number of frames input by a transport.
|
198
157
|
#
|
199
|
-
|
158
|
+
proton_get :frames_input
|
200
159
|
|
201
160
|
# @private
|
202
161
|
include Util::ErrorHandler
|
203
162
|
|
204
|
-
can_raise_error :process, :error_class => TransportError
|
205
|
-
can_raise_error :close_tail, :error_class => TransportError
|
206
|
-
can_raise_error :pending, :error_class => TransportError, :below => Error::EOS
|
207
|
-
can_raise_error :close_head, :error_class => TransportError
|
208
|
-
|
209
|
-
# @private
|
210
|
-
include Util::Wrapper
|
211
|
-
|
212
163
|
# @private
|
213
164
|
def self.wrap(impl)
|
214
165
|
return nil if impl.nil?
|
215
166
|
|
216
|
-
self.fetch_instance(impl, :pn_transport_attachments) || Transport.new(
|
167
|
+
self.fetch_instance(impl, :pn_transport_attachments) || Transport.new(impl)
|
217
168
|
end
|
218
169
|
|
219
170
|
# Creates a new transport instance.
|
220
|
-
|
221
|
-
# @param mode [Integer] The transport mode, either CLIENT or SERVER
|
222
|
-
# @param impl [pn_transport_t] Should not be used.
|
223
|
-
#
|
224
|
-
# @raise [TransportError] If the mode is invalid.
|
225
|
-
#
|
226
|
-
def initialize(mode = nil, impl = Cproton.pn_transport)
|
171
|
+
def initialize(impl = Cproton.pn_transport)
|
227
172
|
@impl = impl
|
228
|
-
if mode == SERVER
|
229
|
-
Cproton.pn_transport_set_server(@impl)
|
230
|
-
elsif (!mode.nil? && mode != CLIENT)
|
231
|
-
raise TransportError.new("cannot create transport for mode: #{mode}")
|
232
|
-
end
|
233
173
|
self.class.store_instance(self, :pn_transport_attachments)
|
234
174
|
end
|
235
175
|
|
176
|
+
# Set server mode for this tranport - enables protocol detection
|
177
|
+
# and server-side authentication for incoming connections
|
178
|
+
def set_server() Cproton.pn_transport_set_server(@impl); end
|
179
|
+
|
236
180
|
# Returns whether the transport has any buffered data.
|
237
181
|
#
|
238
182
|
# @return [Boolean] True if the transport has no buffered data.
|
@@ -241,15 +185,15 @@ module Qpid::Proton
|
|
241
185
|
Cproton.pn_transport_quiesced(@impl)
|
242
186
|
end
|
243
187
|
|
244
|
-
#
|
245
|
-
#
|
246
|
-
# When a TRANSPORT_ERROR event occurs, this operaiton can be used to
|
247
|
-
# access the details of the error condition.
|
248
|
-
#
|
249
|
-
# The object returned is valid until the Transport is discarded.
|
250
|
-
#
|
188
|
+
# @return [Condition, nil] transport error condition or nil if there is no error.
|
251
189
|
def condition
|
252
|
-
|
190
|
+
Condition.convert(Cproton.pn_transport_condition(@impl))
|
191
|
+
end
|
192
|
+
|
193
|
+
# Set the error condition for the transport.
|
194
|
+
# @param c [Condition] The condition to set
|
195
|
+
def condition=(c)
|
196
|
+
Condition.assign(Cproton.pn_transport_condition(@impl), c)
|
253
197
|
end
|
254
198
|
|
255
199
|
# Binds to the given connection.
|
@@ -400,7 +344,7 @@ module Qpid::Proton
|
|
400
344
|
# @return [SSL] The SSL object.
|
401
345
|
#
|
402
346
|
def ssl(domain = nil, session_details = nil)
|
403
|
-
@ssl ||= SSL.create(self, domain, session_details)
|
347
|
+
@ssl ||= SSL.create(self, domain, session_details)
|
404
348
|
end
|
405
349
|
|
406
350
|
# @private
|
@@ -408,6 +352,27 @@ module Qpid::Proton
|
|
408
352
|
!@ssl.nil?
|
409
353
|
end
|
410
354
|
|
411
|
-
|
355
|
+
# @private
|
356
|
+
# Options are documented {Connection#open}, keep that consistent with this
|
357
|
+
def apply opts
|
358
|
+
sasl if opts[:sasl_enabled] # Explicitly enabled
|
359
|
+
unless opts.include?(:sasl_enabled) && !opts[:sasl_enabled] # Not explicitly disabled
|
360
|
+
sasl.allowed_mechs = opts[:sasl_allowed_mechs] if opts.include? :sasl_allowed_mechs
|
361
|
+
sasl.allow_insecure_mechs = opts[:sasl_allow_insecure_mechs] if opts.include? :sasl_allow_insecure_mechs
|
362
|
+
end
|
363
|
+
self.channel_max= opts[:max_sessions] if opts.include? :max_sessions
|
364
|
+
self.max_frame = opts[:max_frame_size] if opts.include? :max_frame_size
|
365
|
+
# NOTE: The idle_timeout option is in Numeric *seconds*, can be Integer, Float or Rational.
|
366
|
+
# This is consistent with idiomatic ruby.
|
367
|
+
# The transport #idle_timeout property is in *milliseconds* passed direct to C.
|
368
|
+
# Direct use of the transport is deprecated.
|
369
|
+
self.idle_timeout= (opts[:idle_timeout]*1000).round if opts.include? :idle_timeout
|
370
|
+
self.ssl(opts[:ssl_domain]) if opts[:ssl_domain]
|
371
|
+
end
|
412
372
|
|
373
|
+
can_raise_error :process, :error_class => TransportError
|
374
|
+
can_raise_error :close_tail, :error_class => TransportError
|
375
|
+
can_raise_error :pending, :error_class => TransportError, :below => Error::EOS
|
376
|
+
can_raise_error :close_head, :error_class => TransportError
|
377
|
+
end
|
413
378
|
end
|
data/lib/core/uri.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
# Licensed to the Apache Software Foundation (ASF) under one
|
2
|
+
# or more contributor license agreements. See the NOTICE file
|
3
|
+
# distributed with this work for additional information
|
4
|
+
# regarding copyright ownership. The ASF licenses this file
|
5
|
+
# to you under the Apache License, Version 2.0 (the
|
6
|
+
# "License"); you may not use this file except in compliance
|
7
|
+
# with the License. You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing,
|
12
|
+
# software distributed under the License is distributed on an
|
13
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
14
|
+
# KIND, either express or implied. See the License for the
|
15
|
+
# specific language governing permissions and limitations
|
16
|
+
# under the License.
|
17
|
+
|
18
|
+
|
19
|
+
require 'uri'
|
20
|
+
|
21
|
+
# Extend the standard ruby {URI} with AMQP and AMQPS schemes
|
22
|
+
module URI
|
23
|
+
# AMQP URI scheme for the AMQP protocol
|
24
|
+
class AMQP < Generic
|
25
|
+
DEFAULT_PORT = 5672
|
26
|
+
|
27
|
+
# @return [String] The AMQP address is the {#path} stripped of any leading "/"
|
28
|
+
def amqp_address() path[0] == "/" ? path[1..-1] : path; end
|
29
|
+
end
|
30
|
+
@@schemes['AMQP'] = AMQP
|
31
|
+
|
32
|
+
# AMQPS URI scheme for the AMQP protocol over TLS
|
33
|
+
class AMQPS < AMQP
|
34
|
+
DEFAULT_PORT = 5671
|
35
|
+
end
|
36
|
+
@@schemes['AMQPS'] = AMQPS
|
37
|
+
end
|
38
|
+
|
39
|
+
module Qpid::Proton
|
40
|
+
# Returns +s+ converted to a {URI::AMQP} or {URI::AMQPS} object
|
41
|
+
#
|
42
|
+
# Shortcut strings are allowed: an "amqp://" prefix is added if +s+ does
|
43
|
+
# not already look like an 'amqp:', 'amqps:' URI.
|
44
|
+
#
|
45
|
+
# @note this does not give the same result as a standard URI parser in all cases.
|
46
|
+
# For standard conversion to a URI use: {#URI}(s)
|
47
|
+
#
|
48
|
+
# @param s [String,URI] String to convert to a URI, or a URI object.
|
49
|
+
# A URI object with no scheme will be converted to {URI::AMQP}
|
50
|
+
# @return [URI::AMQP] A valid {URI::AMQP} or {URI::AMQPS} object
|
51
|
+
# @raise [BadURIError] s is a URI object with a non-AMQP scheme
|
52
|
+
# @raise [InvalidURIError] s cannot be parsed as a URI or shortcut
|
53
|
+
# @raise [::ArgumentError] s is not a string or URI
|
54
|
+
#
|
55
|
+
def self.uri(s)
|
56
|
+
case s
|
57
|
+
when URI::AMQP then s # Pass-thru
|
58
|
+
when URI::Generic
|
59
|
+
s.scheme ||= 'amqp'
|
60
|
+
u = URI.parse(s.to_s) # Re-parse as amqp
|
61
|
+
raise URI::BadURIError, "Not an AMQP URI: '#{u}'" unless u.is_a? URI::AMQP
|
62
|
+
u
|
63
|
+
else
|
64
|
+
s = String.try_convert s
|
65
|
+
raise ::ArgumentError, "bad argument (expected URI object or URI string)" unless s
|
66
|
+
case s
|
67
|
+
when %r{^amqps?:} then URI.parse(s) # Looks like an AMQP URI
|
68
|
+
when %r{^//} then URI.parse("amqp:#{s}") # Looks like a scheme-less URI
|
69
|
+
else URI.parse("amqp://#{s}") # Treat as a bare host:port/path string
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|