qpid_proton 0.17.0 → 0.18.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.
data/lib/core/url.rb CHANGED
@@ -28,11 +28,13 @@ module Qpid::Proton
28
28
  attr_reader :port
29
29
  attr_reader :path
30
30
 
31
+ # Parse a string, return a new URL
32
+ # @param url [#to_s] the URL string
31
33
  def initialize(url = nil, options = {})
32
34
  options[:defaults] = true
33
35
 
34
36
  if url
35
- @url = Cproton.pn_url_parse(url)
37
+ @url = Cproton.pn_url_parse(url.to_s)
36
38
  if @url.nil?
37
39
  raise ::ArgumentError.new("invalid url: #{url}")
38
40
  end
@@ -71,7 +73,5 @@ module Qpid::Proton
71
73
  @host = @host || "0.0.0.0"
72
74
  @port = @port || 5672
73
75
  end
74
-
75
76
  end
76
-
77
77
  end
@@ -58,7 +58,7 @@ module Qpid::Proton::Handler
58
58
  # is specified.
59
59
  #
60
60
  # @param delivery [Qpid::Proton::Delivery] The delivery.
61
- # @param state [Fixnum] The delivery state.
61
+ # @param state [Integer] The delivery state.
62
62
  #
63
63
  def settle(delivery, state = nil)
64
64
  delivery.update(state) unless state.nil?
@@ -119,7 +119,7 @@ module Qpid::Proton::Handler
119
119
  end
120
120
 
121
121
  def on_connection_opened(event)
122
- Qpid::Proton::Event.dispatch(@delegate, :on_session_opened, event) if !@delegate.nil?
122
+ Qpid::Proton::Event.dispatch(@delegate, :on_connection_opened, event) if !@delegate.nil?
123
123
  end
124
124
 
125
125
  def on_session_opened(event)
@@ -21,15 +21,13 @@ module Qpid::Proton::Handler
21
21
 
22
22
  # A general purpose handler that simplifies processing events.
23
23
  #
24
- # @example
25
- #
26
24
  class MessagingHandler < Qpid::Proton::BaseHandler
27
25
 
28
26
  attr_reader :handlers
29
27
 
30
28
  # Creates a new instance.
31
29
  #
32
- # @param [Fixnum] prefetch
30
+ # @param [Integer] prefetch
33
31
  # @param [Boolean] auto_accept
34
32
  # @param [Boolean] auto_settle
35
33
  # @param [Boolean] peer_close_is_error
@@ -18,7 +18,7 @@
18
18
  #
19
19
 
20
20
  module Qpid::Proton::Messenger
21
-
21
+ #
22
22
  # The +Messenger+ class defines a high level interface for
23
23
  # sending and receiving Messages. Every Messenger contains
24
24
  # a single logical queue of incoming messages and a single
@@ -37,7 +37,7 @@ module Qpid::Proton::Messenger
37
37
  #
38
38
  # The put method copies its Message to the outgoing queue, and may
39
39
  # send queued messages if it can do so without blocking. The send
40
- # method blocks until it has sent the requested number of messages,
40
+ # method blocks until it has sent the requested number of
41
41
  # or until a timeout interrupts the attempt.
42
42
  #
43
43
  # Similarly, the recv method receives messages into the incoming
@@ -694,7 +694,7 @@ module Qpid::Proton::Messenger
694
694
  end
695
695
 
696
696
  def valid_window?(window)
697
- !window.nil? && [Float, Fixnum].include?(window.class)
697
+ !window.nil? && window.is_a?(Numeric)
698
698
  end
699
699
 
700
700
  end
@@ -21,16 +21,24 @@ module Qpid::Proton::Reactor
21
21
 
22
22
  class Connector < Qpid::Proton::BaseHandler
23
23
 
24
- attr_accessor :address
25
- attr_accessor :reconnect
26
- attr_accessor :ssl_domain
24
+ def initialize(connection, url, opts)
25
+ @connection, @opts = connection, opts
26
+ @urls = URLs.new(url) if url
27
+ opts.each do |k,v|
28
+ case k
29
+ when :url, :urls, :address
30
+ @urls = URLs.new(v) unless @urls
31
+ when :reconnect
32
+ @reconnect = v
33
+ end
34
+ end
35
+ raise ::ArgumentError.new("no url for connect") unless @urls
27
36
 
28
- def initialize(connection)
29
- @connection = connection
30
- @address = nil
31
- @heartbeat = nil
32
- @reconnect = nil
33
- @ssl_domain = nil
37
+ # TODO aconway 2017-08-17: review reconnect configuration and defaults
38
+ @reconnect = Backoff.new() unless @reconnect
39
+ @ssl_domain = SessionPerConnection.new # TODO seems this should be configurable
40
+ @connection.overrides = self
41
+ @connection.open
34
42
  end
35
43
 
36
44
  def on_connection_local_open(event)
@@ -38,10 +46,7 @@ module Qpid::Proton::Reactor
38
46
  end
39
47
 
40
48
  def on_connection_remote_open(event)
41
- if !@reconnect.nil?
42
- @reconnect.reset
43
- @transport = nil
44
- end
49
+ @reconnect.reset if @reconnect
45
50
  end
46
51
 
47
52
  def on_transport_tail_closed(event)
@@ -73,26 +78,38 @@ module Qpid::Proton::Reactor
73
78
  end
74
79
 
75
80
  def connect(connection)
76
- url = @address.next
81
+ url = @urls.next
82
+ transport = Qpid::Proton::Transport.new
83
+ @opts.each do |k,v|
84
+ case k
85
+ when :user
86
+ connection.user = v
87
+ when :password
88
+ connection.password = v
89
+ when :heartbeat
90
+ transport.idle_timeout = v.to_i
91
+ when :idle_timeout
92
+ transport.idle_timeout = v.(v*1000).to_i
93
+ when :sasl_enabled
94
+ transport.sasl if v
95
+ when :sasl_allow_insecure_mechs
96
+ transport.sasl.allow_insecure_mechs = v
97
+ when :sasl_allowed_mechs, :sasl_mechanisms
98
+ transport.sasl.allowed_mechs = v
99
+ end
100
+ end
101
+
102
+ # TODO aconway 2017-08-11: hostname setting is incorrect, reactor only
77
103
  connection.hostname = "#{url.host}:#{url.port}"
104
+ connection.user = url.username if url.username && !url.username.empty?
105
+ connection.password = url.password if url.password && !url.password.empty?
78
106
 
79
- transport = Qpid::Proton::Transport.new
80
107
  transport.bind(connection)
81
- if !@heartbeat.nil?
82
- transport.idle_timeout = @heartbeat
83
- elsif (url.scheme == "amqps") && !@ssl_domain.nil?
108
+
109
+ if (url.scheme == "amqps") && @ssl_domain
84
110
  @ssl = Qpid::Proton::SSL.new(transport, @ssl_domain)
85
- @ss.peer_hostname = url.host
86
- elsif !url.username.nil?
87
- sasl = transport.sasl
88
- if url.username == "anonymous"
89
- sasl.mechanisms("ANONYMOUS")
90
- else
91
- sasl.plain(url.username, url.password)
92
- end
111
+ @ssl.peer_hostname = url.host
93
112
  end
94
113
  end
95
-
96
114
  end
97
-
98
115
  end
@@ -19,7 +19,7 @@
19
19
 
20
20
  module Qpid::Proton::Reactor
21
21
 
22
- # @private
22
+ private
23
23
  class InternalTransactionHandler < Qpid::Proton::Handler::OutgoingMessageHandler
24
24
 
25
25
  def initialize
@@ -35,7 +35,7 @@ module Qpid::Proton::Reactor
35
35
 
36
36
  end
37
37
 
38
-
38
+ public
39
39
  # A representation of the AMQP concept of a container which, loosely
40
40
  # speaking, is something that establishes links to or from another
41
41
  # container on which messages are transferred.
@@ -43,9 +43,6 @@ module Qpid::Proton::Reactor
43
43
  # This is an extension to the Reactor classthat adds convenience methods
44
44
  # for creating instances of Qpid::Proton::Connection, Qpid::Proton::Sender
45
45
  # and Qpid::Proton::Receiver.
46
- #
47
- # @example
48
- #
49
46
  class Container < Reactor
50
47
 
51
48
  include Qpid::Proton::Util::Reactor
@@ -74,42 +71,45 @@ module Qpid::Proton::Reactor
74
71
  end
75
72
  end
76
73
 
77
- # Initiates the establishment of an AMQP connection.
74
+ # Initiate an AMQP connection.
78
75
  #
79
- # @param options [Hash] A hash of named arguments.
76
+ # @param url [String] Connect to URL host:port, using user:password@ if present
77
+ # @param opts [Hash] Named options
78
+ # For backwards compatibility, can be called with a single parameter opts.
80
79
  #
81
- def connect(options = {})
82
- conn = self.connection(options[:handler])
83
- conn.container = self.container_id || generate_uuid
84
- connector = Connector.new(conn)
85
- conn.overrides = connector
86
- if !options[:url].nil?
87
- connector.address = URLs.new([options[:url]])
88
- elsif !options[:urls].nil?
89
- connector.address = URLs.new(options[:urls])
90
- elsif !options[:address].nil?
91
- connector.address = URLs.new([Qpid::Proton::URL.new(options[:address])])
92
- else
93
- raise ::ArgumentError.new("either :url or :urls or :address required")
94
- end
95
-
96
- connector.heartbeat = options[:heartbeat] if !options[:heartbeat].nil?
97
- if !options[:reconnect].nil?
98
- connector.reconnect = options[:reconnect]
99
- else
100
- connector.reconnect = Backoff.new()
80
+ # @option opts [String] :url Connect to URL host:port using user:password@ if present.
81
+ # @option opts [String] :user user name for authentication if not given by URL
82
+ # @option opts [String] :password password for authentication if not given by URL
83
+ # @option opts [Numeric] :idle_timeout seconds before closing an idle connection,
84
+ # can be a fractional value.
85
+ # @option opts [Boolean] :sasl_enabled Enable or disable SASL.
86
+ # @option opts [Boolean] :sasl_allow_insecure_mechs Allow mechanisms that disclose clear text
87
+ # passwords, even over an insecure connection. By default, such mechanisms are only allowed
88
+ # when SSL is enabled.
89
+ # @option opts [String] :sasl_allowed_mechs the allowed SASL mechanisms for use on the connection.
90
+ #
91
+ # @option opts [String] :address *deprecated* use the :url option
92
+ # @option opts [Numeric] :heartbeat milliseconds before closing an idle connection.
93
+ # *deprecated* use :idle_timeout => heartbeat/1000
94
+ #
95
+ # @return [Connection] the new connection
96
+ #
97
+ def connect(url, opts = {})
98
+ # Backwards compatible with old connect(options)
99
+ if url.is_a? Hash and opts.empty?
100
+ opts = url
101
+ url = nil
101
102
  end
102
-
103
- connector.ssl_domain = SessionPerConnection.new # TODO seems this should be configurable
104
-
105
- conn.open
106
-
103
+ conn = self.connection(opts[:handler])
104
+ conn.container = self.container_id || generate_uuid
105
+ connector = Connector.new(conn, url, opts)
107
106
  return conn
108
107
  end
109
108
 
109
+ private
110
110
  def _session(context)
111
111
  if context.is_a?(Qpid::Proton::URL)
112
- return self._session(self.connect(:url => context))
112
+ return _session(self.connect(:url => context))
113
113
  elsif context.is_a?(Qpid::Proton::Session)
114
114
  return context
115
115
  elsif context.is_a?(Qpid::Proton::Connection)
@@ -123,16 +123,17 @@ module Qpid::Proton::Reactor
123
123
  end
124
124
  end
125
125
 
126
+ public
126
127
  # Initiates the establishment of a link over which messages can be sent.
127
128
  #
128
129
  # @param context [String, URL] The context.
129
130
  # @param opts [Hash] Additional options.
130
- # @param opts [String, Qpid::Proton::URL] The target address.
131
- # @param opts [String] :source The source address.
132
- # @param opts [Boolean] :dynamic
133
- # @param opts [Object] :handler
134
- # @param opts [Object] :tag_generator The tag generator.
135
- # @param opts [Hash] :options Addtional link options
131
+ # @option opts [String, Qpid::Proton::URL] The target address.
132
+ # @option opts [String] :source The source address.
133
+ # @option opts [Boolean] :dynamic
134
+ # @option opts [Object] :handler
135
+ # @option opts [Object] :tag_generator The tag generator.
136
+ # @option opts [Hash] :options Addtional link options
136
137
  #
137
138
  # @return [Sender] The sender.
138
139
  #
@@ -146,7 +147,7 @@ module Qpid::Proton::Reactor
146
147
  target = context.path
147
148
  end
148
149
 
149
- session = self._session(context)
150
+ session = _session(context)
150
151
 
151
152
  sender = session.sender(opts[:name] ||
152
153
  id(session.connection.container,
@@ -155,7 +156,7 @@ module Qpid::Proton::Reactor
155
156
  sender.target.address = target if target
156
157
  sender.handler = opts[:handler] if !opts[:handler].nil?
157
158
  sender.tag_generator = opts[:tag_generator] if !opts[:tag_gnenerator].nil?
158
- self._apply_link_options(opts[:options], sender)
159
+ _apply_link_options(opts[:options], sender)
159
160
  sender.open
160
161
  return sender
161
162
  end
@@ -192,7 +193,7 @@ module Qpid::Proton::Reactor
192
193
  source = context.path
193
194
  end
194
195
 
195
- session = self._session(context)
196
+ session = _session(context)
196
197
 
197
198
  receiver = session.receiver(opts[:name] ||
198
199
  id(session.connection.container,
@@ -201,7 +202,7 @@ module Qpid::Proton::Reactor
201
202
  receiver.source.dynamic = true if opts.has_key?(:dynamic) && opts[:dynamic]
202
203
  receiver.target.address = opts[:target] if !opts[:target].nil?
203
204
  receiver.handler = opts[:handler] if !opts[:handler].nil?
204
- self._apply_link_options(opts[:options], receiver)
205
+ _apply_link_options(opts[:options], receiver)
205
206
  receiver.open
206
207
  return receiver
207
208
  end
@@ -236,10 +237,7 @@ module Qpid::Proton::Reactor
236
237
  return acceptor
237
238
  end
238
239
 
239
- def do_work(timeout = nil)
240
- self.timeout = timeout unless timeout.nil?
241
- self.process
242
- end
240
+ private
243
241
 
244
242
  def id(container, remote, local)
245
243
  if !local.nil? && !remote.nil?
@@ -89,7 +89,7 @@ module Qpid::Proton::Reactor
89
89
 
90
90
  # Returns the timeout period.
91
91
  #
92
- # @return [Fixnum] The timeout period, in seconds.
92
+ # @return [Integer] The timeout period, in seconds.
93
93
  #
94
94
  def timeout
95
95
  millis_to_timeout(Cproton.pn_reactor_get_timeout(@impl))
@@ -97,7 +97,7 @@ module Qpid::Proton::Reactor
97
97
 
98
98
  # Sets the timeout period.
99
99
  #
100
- # @param timeout [Fixnum] The timeout, in seconds.
100
+ # @param timeout [Integer] The timeout, in seconds.
101
101
  #
102
102
  def timeout=(timeout)
103
103
  Cproton.pn_reactor_set_timeout(@impl, timeout_to_millis(timeout))
data/lib/reactor/urls.rb CHANGED
@@ -22,7 +22,12 @@ module Qpid::Proton::Reactor
22
22
  class URLs
23
23
 
24
24
  def initialize(values)
25
- @values = [values].flatten
25
+ @values = values
26
+ if @values.is_a? Enumerable
27
+ @values = @values.map { |u| Qpid::Proton::URL.new(u) }
28
+ else
29
+ @values = [Qpid::Proton::URL.new(values)]
30
+ end
26
31
  @iter = @values.each
27
32
  end
28
33
 
@@ -21,6 +21,8 @@ module Qpid::Proton::Util
21
21
 
22
22
  class Condition
23
23
 
24
+ attr_reader :name, :description, :info
25
+
24
26
  def initialize(name, description = nil, info = nil)
25
27
  @name = name
26
28
  @description = description
data/lib/util/engine.rb CHANGED
@@ -25,7 +25,7 @@ module Qpid::Proton::Util
25
25
  # Convenience method to receive messages from a delivery.
26
26
  #
27
27
  # @param delivery [Qpid::Proton::Delivery] The delivery.
28
- # @param message [Qpid::Proton::Message] The message to use.
28
+ # @param msg [Qpid::Proton::Message] The message to use.
29
29
  #
30
30
  # @return [Qpid::Proton::Message] the message
31
31
  #
@@ -86,7 +86,7 @@ module Qpid::Proton::Util
86
86
  proton_method = "#{self::PROTON_METHOD_PREFIX}_#{name}"
87
87
  # drop the trailing '?' if this is a property method
88
88
  proton_method = proton_method[0..-2] if proton_method.end_with? "?"
89
- create_wrapper_method(name, proton_method)
89
+ create_wrapper_method(name, proton_method, options[:arg])
90
90
  end
91
91
 
92
92
  def proton_writer(name, options = {})
metadata CHANGED
@@ -1,27 +1,28 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qpid_proton
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.17.0
4
+ version: 0.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Darryl L. Pierce
8
+ - Alan Conway
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2017-02-22 00:00:00.000000000 Z
12
+ date: 2017-10-25 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: json
15
16
  requirement: !ruby/object:Gem::Requirement
16
17
  requirements:
17
- - - ">="
18
+ - - "~>"
18
19
  - !ruby/object:Gem::Version
19
20
  version: '0'
20
21
  type: :runtime
21
22
  prerelease: false
22
23
  version_requirements: !ruby/object:Gem::Requirement
23
24
  requirements:
24
- - - ">="
25
+ - - "~>"
25
26
  - !ruby/object:Gem::Version
26
27
  version: '0'
27
28
  description: |
@@ -126,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
126
127
  version: '0'
127
128
  requirements: []
128
129
  rubyforge_project:
129
- rubygems_version: 2.6.8
130
+ rubygems_version: 2.5.2.1
130
131
  signing_key:
131
132
  specification_version: 4
132
133
  summary: Ruby language bindings for the Qpid Proton messaging framework