Skip to content

Commit 085a622

Browse files
author
Jeremy Bopp
committed
DRY up connection handling logic
1 parent cede61d commit 085a622

File tree

1 file changed

+26
-33
lines changed

1 file changed

+26
-33
lines changed

lib/net/ldap/connection.rb

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -8,56 +8,49 @@ 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]
14-
prepare_socket(server)
13+
prepare_socket(server[:socket], server[:encryption])
1514
else
16-
open_connection(server)
15+
hosts = server[:hosts]
16+
hosts = [[server[:host], server[:port]]] if hosts.nil?
17+
open_connection(hosts, server[:encryption])
1718
end
1819

1920
yield self if block_given?
2021
end
2122

22-
def prepare_socket(server)
23-
@conn = server[:socket]
24-
25-
if server[:encryption]
26-
setup_encryption server[:encryption]
27-
end
23+
def prepare_socket(socket, encryption, close = false)
24+
@conn = socket
25+
setup_encryption encryption if encryption
26+
rescue
27+
# Ensure the connection is closed when requested in the event of an SSL
28+
# setup failure.
29+
@conn.close if close
30+
@conn = nil
31+
raise
2832
end
2933

30-
def open_connection(server)
34+
def open_connection(hosts, encryption)
3135
errors = []
32-
server[:hosts].each do |host, port|
36+
hosts.each do |host, port|
3337
begin
34-
return connect_to_host(host, port, server)
35-
rescue Net::LDAP::Error
36-
errors << $!
38+
prepare_socket(TCPSocket.new(host, port), encryption, true)
39+
return
40+
rescue Net::LDAP::Error, SocketError, SystemCallError,
41+
OpenSSL::SSL::SSLError
42+
errors << [$!, host, port]
3743
end
3844
end
3945

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."
46+
if errors.size == 1
47+
error = errors.first.first
48+
raise Net::LDAP::ConnectionRefusedError, error.message if error.kind_of? Errno::ECONNREFUSED
49+
raise Net::LDAP::Error, error.message
5650
end
5751

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

6356
module GetbyteForSSLSocket

0 commit comments

Comments
 (0)