@@ -685,7 +685,7 @@ def self.tcp(host, port, local_host = nil, local_port = nil, connect_timeout: ni
685685 # :stopdoc:
686686 def self . tcp_with_fast_fallback ( host , port , local_host = nil , local_port = nil , connect_timeout : nil , resolv_timeout : nil , open_timeout : nil )
687687 if local_host || local_port
688- local_addrinfos = Addrinfo . getaddrinfo ( local_host , local_port , nil , :STREAM , timeout : resolv_timeout )
688+ local_addrinfos = Addrinfo . getaddrinfo ( local_host , local_port , nil , :STREAM , timeout : open_timeout || resolv_timeout )
689689 resolving_family_names = local_addrinfos . map { |lai | ADDRESS_FAMILIES . key ( lai . afamily ) } . uniq
690690 else
691691 local_addrinfos = [ ]
@@ -698,6 +698,7 @@ def self.tcp_with_fast_fallback(host, port, local_host = nil, local_port = nil,
698698 is_windows_environment ||= ( RUBY_PLATFORM =~ /mswin|mingw|cygwin/ )
699699
700700 now = current_clock_time
701+ starts_at = now
701702 resolution_delay_expires_at = nil
702703 connection_attempt_delay_expires_at = nil
703704 user_specified_connect_timeout_at = nil
@@ -707,7 +708,7 @@ def self.tcp_with_fast_fallback(host, port, local_host = nil, local_port = nil,
707708
708709 if resolving_family_names . size == 1
709710 family_name = resolving_family_names . first
710- addrinfos = Addrinfo . getaddrinfo ( host , port , ADDRESS_FAMILIES [ :family_name ] , :STREAM , timeout : resolv_timeout )
711+ addrinfos = Addrinfo . getaddrinfo ( host , port , ADDRESS_FAMILIES [ :family_name ] , :STREAM , timeout : open_timeout || resolv_timeout )
711712 resolution_store . add_resolved ( family_name , addrinfos )
712713 hostname_resolution_result = nil
713714 hostname_resolution_notifier = nil
@@ -724,7 +725,6 @@ def self.tcp_with_fast_fallback(host, port, local_host = nil, local_port = nil,
724725 thread
725726 }
726727 )
727-
728728 user_specified_resolv_timeout_at = resolv_timeout ? now + resolv_timeout : Float ::INFINITY
729729 end
730730
@@ -758,9 +758,16 @@ def self.tcp_with_fast_fallback(host, port, local_host = nil, local_port = nil,
758758 socket . bind ( local_addrinfo ) if local_addrinfo
759759 result = socket . connect_nonblock ( addrinfo , exception : false )
760760 else
761+ timeout =
762+ if open_timeout
763+ t = open_timeout - ( current_clock_time - starts_at )
764+ t . negative? ? 0 : t
765+ else
766+ connect_timeout
767+ end
761768 result = socket = local_addrinfo ?
762- addrinfo . connect_from ( local_addrinfo , timeout : connect_timeout ) :
763- addrinfo . connect ( timeout : connect_timeout )
769+ addrinfo . connect_from ( local_addrinfo , timeout :) :
770+ addrinfo . connect ( timeout :)
764771 end
765772
766773 if result == :wait_writable
@@ -934,7 +941,7 @@ def self.tcp_without_fast_fallback(host, port, local_host, local_port, connect_t
934941
935942 local_addr_list = nil
936943 if local_host != nil || local_port != nil
937- local_addr_list = Addrinfo . getaddrinfo ( local_host , local_port , nil , :STREAM , nil )
944+ local_addr_list = Addrinfo . getaddrinfo ( local_host , local_port , nil , :STREAM , nil , timeout : open_timeout || resolv_timeout )
938945 end
939946
940947 timeout = open_timeout ? open_timeout : resolv_timeout
0 commit comments