added support for resolve timeout in the system resolver

This commit is contained in:
HoneyryderChuck 2022-01-03 17:29:28 +02:00
parent c17a260fe8
commit 4641797a7f

View File

@ -158,10 +158,18 @@ module HTTPX
def async_resolve(connection, hostname, scheme)
families = connection.options.ip_families
log { "resolver: query for #{hostname}" }
resolve_timeout = @timeouts[connection.origin.host].first
Thread.start do
Thread.current.report_on_exception = false
begin
addrs = __addrinfo_resolve(hostname, scheme)
addrs = if resolve_timeout
Timeout.timeout(resolve_timeout) do
__addrinfo_resolve(hostname, scheme)
end
else
__addrinfo_resolve(hostname, scheme)
end
addrs = addrs.sort_by(&:afamily).group_by(&:afamily)
families.each do |family|
addresses = addrs[family]
@ -174,6 +182,15 @@ module HTTPX
@pipe_write.putc(DONE) unless @pipe_write.closed?
end
end
rescue Timeout::Error => e
ex = ResolveTimeoutError.new(resolve_timeout, e.message)
ex.set_backtrace(ex.backtrace)
@pipe_mutex.synchronize do
families.each do |family|
@ips.unshift([family, connection, ex])
@pipe_write.putc(ERROR) unless @pipe_write.closed?
end
end
rescue StandardError => e
@pipe_mutex.synchronize do
families.each do |family|