Skip to content

Commit

Permalink
Handle URI query parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
Tensho committed Dec 20, 2017
1 parent e87df00 commit 3914c06
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 9 deletions.
4 changes: 2 additions & 2 deletions lib/bunny/session.rb
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ def initialize(connection_string_or_opts = ENV['RABBITMQ_URL'], optz = Hash.new)

client_props = opts[:properties] || opts[:client_properties] || {}
@client_properties = DEFAULT_CLIENT_PROPERTIES.merge(client_props)
@mechanism = normalize_auth_mechanism(opts.fetch(:auth_mechanism, "PLAIN"))
@mechanism = (opts[:auth_mechanism] || []).first || "PLAIN"
@credentials_encoder = credentials_encoder_for(@mechanism)
@locale = @opts.fetch(:locale, DEFAULT_LOCALE)

Expand Down Expand Up @@ -464,7 +464,7 @@ def blocked?
# @param [String] uri amqp or amqps URI to parse
# @return [Hash] Parsed URI as a hash
def self.parse_uri(uri)
AMQ::Settings.parse_amqp_url(uri)
AMQ::Settings.configure(uri)
end

# Checks if a queue with given name exists.
Expand Down
14 changes: 9 additions & 5 deletions lib/bunny/transport.rb
Original file line number Diff line number Diff line change
Expand Up @@ -303,12 +303,16 @@ def tls_enabled?(opts)
(opts[:port] == AMQ::Protocol::TLS_PORT) || false
end

def tls_ca_certificates_paths_from(opts)
Array(opts[:cacertfile] || opts[:tls_ca_certificates] || opts[:ssl_ca_certificates])
end

def tls_certificate_path_from(opts)
opts[:tls_cert] || opts[:ssl_cert] || opts[:tls_cert_path] || opts[:ssl_cert_path] || opts[:tls_certificate_path] || opts[:ssl_certificate_path]
opts[:certfile] || opts[:tls_cert] || opts[:ssl_cert] || opts[:tls_cert_path] || opts[:ssl_cert_path] || opts[:tls_certificate_path] || opts[:ssl_certificate_path]
end

def tls_key_path_from(opts)
opts[:tls_key] || opts[:ssl_key] || opts[:tls_key_path] || opts[:ssl_key_path]
opts[:keyfile] || opts[:tls_key] || opts[:ssl_key] || opts[:tls_key_path] || opts[:ssl_key_path]
end

def tls_certificate_from(opts)
Expand Down Expand Up @@ -337,7 +341,7 @@ def inline_client_key_from(opts)
end

def prepare_tls_context(opts)
if (opts[:verify_ssl] || opts[:verify_peer]).nil?
if (opts[:verify_ssl] || opts[:verify_peer] || opts[:verify]).nil?
opts[:verify_peer] = true
end

Expand All @@ -349,8 +353,8 @@ def prepare_tls_context(opts)
@tls_key = tls_key_from(opts)
@tls_certificate_store = opts[:tls_certificate_store]

@tls_ca_certificates = opts.fetch(:tls_ca_certificates, default_tls_certificates)
@verify_peer = (opts[:verify_ssl] || opts[:verify_peer])
@tls_ca_certificates = tls_ca_certificates_paths_from(opts) || default_tls_certificates
@verify_peer = (opts[:verify_ssl] || opts[:verify_peer] || opts[:verify])

@tls_context = initialize_tls_context(OpenSSL::SSL::SSLContext.new, opts)
end
Expand Down
28 changes: 26 additions & 2 deletions spec/higher_level_api/integration/connection_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,30 @@
expect { described_class.new("amqp://dev.rabbitmq.com/a/path/with/slashes") }.to raise_error(ArgumentError)
end
end

context "when URI contains query parameters" do
subject(:session) do
described_class.new("amqps://bunny_gem:bunny_password@/bunny_testbed?heartbeat=10&connection_timeout=100&channel_max=1000&verify=false&cacertfile=spec/tls/ca_certificate.pem&certfile=spec/tls/client_certificate.pem&keyfile=spec/tls/client_key.pem")
end

it "parses extra connection parameters" do
# session.start # raises "OpenSSL::SSL::SSLError: hostname "127.0.0.1" does not match the server certificate"

expect(session.user).to eq "bunny_gem"
expect(session.pass).to eq "bunny_password"
expect(session.hostname).to eq "127.0.0.1"
expect(session.port).to eq 5671
expect(session.vhost).to eq "bunny_testbed"
# expect(session.heartbeat).to eq(10) # require open_connection (session start)
expect(session.transport.connect_timeout).to eq(100)
expect(session.channel_max).to eq(1000)
expect(session.ssl?).to eq(true)
expect(session.transport.instance_variable_get(:@verify_peer)).to eq(false)
expect(session.transport.instance_variable_get(:@tls_ca_certificates)).to eq(["spec/tls/ca_certificate.pem"])
expect(session.transport.instance_variable_get(:@tls_ca_certificates)).to eq(["spec/tls/ca_certificate.pem"])
expect(session.transport.instance_variable_get(:@tls_key_path)).to eq("spec/tls/client_key.pem")
end
end
end

context "initialized with all defaults" do
Expand Down Expand Up @@ -319,9 +343,9 @@
password: "bunny_password",
vhost: "bunny_testbed",
ssl: true,
ssl_cert: "spec/tls/client_cert.pem",
ssl_cert: "spec/tls/client_certificate.pem",
ssl_key: "spec/tls/client_key.pem",
ssl_ca_certificates: ["./spec/tls/cacert.pem"])
ssl_ca_certificates: ["./spec/tls/ca_certificate.pem"])
end

it "uses TLS port" do
Expand Down

0 comments on commit 3914c06

Please sign in to comment.