qpid_proton 0.17.0 → 0.18.0

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