@@ -8,56 +8,54 @@ class Net::LDAP::Connection #:nodoc:
8
8
9
9
def initialize ( server )
10
10
@instrumentation_service = server [ :instrumentation_service ]
11
- server [ :hosts ] = [ [ server [ :host ] , server [ :port ] ] ] if server [ :hosts ] . nil?
12
11
13
12
if server [ :socket ]
14
13
prepare_socket ( server )
15
14
else
15
+ server [ :hosts ] = [ [ server [ :host ] , server [ :port ] ] ] if server [ :hosts ] . nil?
16
16
open_connection ( server )
17
17
end
18
18
19
19
yield self if block_given?
20
20
end
21
21
22
- def prepare_socket ( server )
23
- @conn = server [ :socket ]
22
+ def prepare_socket ( server , close = false )
23
+ socket = server [ :socket ]
24
+ encryption = server [ :encryption ]
24
25
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
28
34
end
29
35
30
36
def open_connection ( server )
37
+ hosts = server [ :hosts ]
38
+ encryption = server [ :encryption ]
39
+
31
40
errors = [ ]
32
- server [ : hosts] . each do |host , port |
41
+ hosts . each do |host , port |
33
42
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 ]
37
48
end
38
49
end
39
50
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
56
55
end
57
56
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 " ) } "
61
59
end
62
60
63
61
module GetbyteForSSLSocket
0 commit comments