@@ -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