@@ -119,6 +119,7 @@ def hash
119119 def initialize ( seed , options = { } )
120120 @seed = seed
121121 @host , @port = parse_host_port
122+ @options = options
122123 end
123124
124125 # Get a pretty printed address inspection.
@@ -138,15 +139,15 @@ def inspect
138139 # @example Get a socket.
139140 # address.socket(5, :ssl => true)
140141 #
141- # @param [ Float ] timeout The socket timeout.
142+ # @param [ Float ] socket_timeout The socket timeout.
142143 # @param [ Hash ] ssl_options SSL options.
143144 #
144145 # @return [ Pool::Socket::SSL, Pool::Socket::TCP, Pool::Socket::Unix ] The socket.
145146 #
146147 # @since 2.0.0
147- def socket ( timeout , ssl_options = { } )
148- @resolver ||= initialize_resolver! ( timeout , ssl_options )
149- @resolver . socket ( timeout , ssl_options )
148+ def socket ( socket_timeout , ssl_options = { } )
149+ @resolver ||= initialize_resolver! ( ssl_options )
150+ @resolver . socket ( socket_timeout , ssl_options )
150151 end
151152
152153 # Get the address as a string.
@@ -161,19 +162,33 @@ def to_s
161162 port ? "#{ host } :#{ port } " : host
162163 end
163164
165+ # Connect a socket.
166+ #
167+ # @example Connect a socket.
168+ # address.connect_socket!(socket)
169+ #
170+ # @since 2.4.3
171+ def connect_socket! ( socket )
172+ socket . connect! ( connect_timeout )
173+ end
174+
164175 private
165176
166- def initialize_resolver! ( timeout , ssl_options )
177+ def connect_timeout
178+ @connect_timeout ||= @options [ :connect_timeout ] || Server ::CONNECT_TIMEOUT
179+ end
180+
181+ def initialize_resolver! ( ssl_options )
167182 return Unix . new ( seed . downcase ) if seed . downcase =~ Unix ::MATCH
168183
169184 family = ( host == LOCALHOST ) ? ::Socket ::AF_INET : ::Socket ::AF_UNSPEC
170185 error = nil
171186 ::Socket . getaddrinfo ( host , nil , family , ::Socket ::SOCK_STREAM ) . each do |info |
172187 begin
173188 res = FAMILY_MAP [ info [ 4 ] ] . new ( info [ 3 ] , port , host )
174- res . socket ( timeout , ssl_options ) . connect! . close
189+ res . socket ( connect_timeout , ssl_options ) . connect! ( connect_timeout ) . close
175190 return res
176- rescue IOError , SystemCallError , Error ::SocketError => e
191+ rescue IOError , SystemCallError , Error ::SocketTimeoutError , Error :: SocketError => e
177192 error = e
178193 end
179194 end
0 commit comments