improve resolver logs to include record family in prefix

also, fixed some of the arithmetic associated with logging timeout logs
This commit is contained in:
HoneyryderChuck 2025-01-02 23:49:01 +00:00
parent 17003840d3
commit 44311d08a5
4 changed files with 31 additions and 13 deletions

View File

@ -82,7 +82,9 @@ module HTTPX
if hostname.nil?
hostname = connection.peer.host
log { "resolver: resolve IDN #{connection.peer.non_ascii_hostname} as #{hostname}" } if connection.peer.non_ascii_hostname
log do
"resolver #{FAMILY_TYPES[@record_type]}: resolve IDN #{connection.peer.non_ascii_hostname} as #{hostname}"
end if connection.peer.non_ascii_hostname
hostname = @resolver.generate_candidates(hostname).each do |name|
@queries[name.to_s] = connection
@ -90,7 +92,7 @@ module HTTPX
else
@queries[hostname] = connection
end
log { "resolver: query #{FAMILY_TYPES[RECORD_TYPES[@family]]} for #{hostname}" }
log { "resolver #{FAMILY_TYPES[@record_type]}: query for #{hostname}" }
begin
request = build_request(hostname)

View File

@ -63,7 +63,10 @@ module HTTPX
@ns_index += 1
nameserver = @nameserver
if nameserver && @ns_index < nameserver.size
log { "resolver: failed resolving on nameserver #{@nameserver[@ns_index - 1]} (#{e.message})" }
log do
"resolver #{FAMILY_TYPES[@record_type]}: " \
"failed resolving on nameserver #{@nameserver[@ns_index - 1]} (#{e.message})"
end
transition(:idle)
@timeouts.clear
else
@ -140,17 +143,22 @@ module HTTPX
return unless timeout <= 0
elapsed_after = @_timeouts[@_timeouts.size - @timeouts[host].size]
@timeouts[host].shift
if !@timeouts[host].empty?
log { "resolver: timeout after #{timeout}s, retry(#{@timeouts[host].first}) #{host}..." }
log do
"resolver #{FAMILY_TYPES[@record_type]}: timeout after #{elapsed_after}s, retry (with #{@timeouts[host].first}s) #{host}..."
end
# must downgrade to tcp AND retry on same host as last
downgrade_socket
resolve(connection, h)
elsif @ns_index + 1 < @nameserver.size
# try on the next nameserver
@ns_index += 1
log { "resolver: failed resolving #{host} on nameserver #{@nameserver[@ns_index - 1]} (timeout error)" }
log do
"resolver #{FAMILY_TYPES[@record_type]}: failed resolving #{host} on nameserver #{@nameserver[@ns_index - 1]} (timeout error)"
end
transition(:idle)
@timeouts.clear
resolve(connection, h)
@ -326,7 +334,7 @@ module HTTPX
transition(:idle)
transition(:open)
end
log { "resolver: ALIAS #{hostname_alias} for #{name}" }
log { "resolver #{FAMILY_TYPES[@record_type]}: ALIAS #{hostname_alias} for #{name}" }
resolve(connection, hostname_alias)
return
end
@ -352,7 +360,10 @@ module HTTPX
if hostname.nil?
hostname = connection.peer.host
log { "resolver: resolve IDN #{connection.peer.non_ascii_hostname} as #{hostname}" } if connection.peer.non_ascii_hostname
log do
"resolver #{FAMILY_TYPES[@record_type]}: " \
"resolve IDN #{connection.peer.non_ascii_hostname} as #{hostname}"
end if connection.peer.non_ascii_hostname
hostname = generate_candidates(hostname).each do |name|
@queries[name] = connection
@ -360,7 +371,7 @@ module HTTPX
else
@queries[hostname] = connection
end
log { "resolver: query #{@record_type.name.split("::").last} for #{hostname}" }
log { "resolver #{FAMILY_TYPES[@record_type]}: query for #{hostname}" }
begin
@write_buffer << encode_dns_query(hostname)
rescue Resolv::DNS::EncodeError => e
@ -397,10 +408,10 @@ module HTTPX
case @socket_type
when :udp
log { "resolver: server: udp://#{ip}:#{port}..." }
log { "resolver #{FAMILY_TYPES[@record_type]}: server: udp://#{ip}:#{port}..." }
UDP.new(ip, port, @options)
when :tcp
log { "resolver: server: tcp://#{ip}:#{port}..." }
log { "resolver #{FAMILY_TYPES[@record_type]}: server: tcp://#{ip}:#{port}..." }
origin = URI("tcp://#{ip}:#{port}")
TCP.new(origin, [ip], @options)
end

View File

@ -72,13 +72,16 @@ module HTTPX
# double emission check, but allow early resolution to work
return if !early_resolve && connection.addresses && !addresses.intersect?(connection.addresses)
log { "resolver: answer #{FAMILY_TYPES[RECORD_TYPES[family]]} #{connection.peer.host}: #{addresses.inspect}" }
log do
"resolver #{FAMILY_TYPES[RECORD_TYPES[family]]}: " \
"answer #{FAMILY_TYPES[RECORD_TYPES[family]]} #{connection.peer.host}: #{addresses.inspect}"
end
if @current_selector && # if triggered by early resolve, session may not be here yet
!connection.io &&
connection.options.ip_families.size > 1 &&
family == Socket::AF_INET &&
addresses.first.to_s != connection.peer.host.to_s
log { "resolver: A response, applying resolution delay..." }
log { "resolver #{FAMILY_TYPES[RECORD_TYPES[family]]}: applying resolution delay..." }
@current_selector.after(0.05) do
unless connection.state == :closed ||
# double emission check

View File

@ -162,7 +162,9 @@ module HTTPX
hostname = connection.peer.host
scheme = connection.origin.scheme
log { "resolver: resolve IDN #{connection.peer.non_ascii_hostname} as #{hostname}" } if connection.peer.non_ascii_hostname
log do
"resolver: resolve IDN #{connection.peer.non_ascii_hostname} as #{hostname}"
end if connection.peer.non_ascii_hostname
transition(:open)