Skip to content

Commit d5f7516

Browse files
author
Jeremy Bopp
committed
DRY up connection handling logic
1 parent 4157684 commit d5f7516

File tree

1 file changed

+27
-29
lines changed

1 file changed

+27
-29
lines changed

lib/net/ldap/connection.rb

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -8,56 +8,54 @@ class Net::LDAP::Connection #:nodoc:
88

99
def initialize(server)
1010
@instrumentation_service = server[:instrumentation_service]
11-
server[:hosts] = [[server[:host], server[:port]]] if server[:hosts].nil?
1211

1312
if server[:socket]
1413
prepare_socket(server)
1514
else
15+
server[:hosts] = [[server[:host], server[:port]]] if server[:hosts].nil?
1616
open_connection(server)
1717
end
1818

1919
yield self if block_given?
2020
end
2121

22-
def prepare_socket(server)
23-
@conn = server[:socket]
22+
def prepare_socket(server, close = false)
23+
socket = server[:socket]
24+
encryption = server[:encryption]
2425

25-
if server[:encryption]
26-
setup_encryption server[:encryption]
27-
end
26+
@conn = socket
27+
setup_encryption encryption if encryption
28+
rescue
29+
# Ensure the connection is closed when requested in the event of an SSL
30+
# setup failure.
31+
@conn.close if close
32+
@conn = nil
33+
raise
2834
end
2935

3036
def open_connection(server)
37+
hosts = server[:hosts]
38+
encryption = server[:encryption]
39+
3140
errors = []
32-
server[:hosts].each do |host, port|
41+
hosts.each do |host, port|
3342
begin
34-
return connect_to_host(host, port, server)
35-
rescue Net::LDAP::Error
36-
errors << $!
43+
prepare_socket(server.merge(socket: TCPSocket.new(host, port)), true)
44+
return
45+
rescue Net::LDAP::Error, SocketError, SystemCallError,
46+
OpenSSL::SSL::SSLError
47+
errors << [$!, host, port]
3748
end
3849
end
3950

40-
raise errors.first if errors.size == 1
41-
raise Net::LDAP::Error,
42-
"Unable to connect to any given server: \n #{errors.join("\n ")}"
43-
end
44-
45-
def connect_to_host(host, port, server)
46-
begin
47-
@conn = TCPSocket.new(host, port)
48-
rescue SocketError
49-
raise Net::LDAP::Error, "No such address or other socket error."
50-
rescue Errno::ECONNREFUSED
51-
raise Net::LDAP::ConnectionRefusedError, "Server #{host} refused connection on port #{port}."
52-
rescue Errno::EHOSTUNREACH => error
53-
raise Net::LDAP::Error, "Host #{host} was unreachable (#{error.message})"
54-
rescue Errno::ETIMEDOUT
55-
raise Net::LDAP::Error, "Connection to #{host} timed out."
51+
if errors.size == 1
52+
error = errors.first.first
53+
raise Net::LDAP::ConnectionRefusedError, error.message if error.kind_of? Errno::ECONNREFUSED
54+
raise Net::LDAP::Error, error.message
5655
end
5756

58-
if server[:encryption]
59-
setup_encryption server[:encryption]
60-
end
57+
raise Net::LDAP::Error,
58+
"Unable to connect to any given server: \n #{errors.map { |e, h, p| "#{e.class}: #{e.message} (#{h}:#{p})" }.join("\n ")}"
6159
end
6260

6361
module GetbyteForSSLSocket

0 commit comments

Comments
 (0)