Merge branch 'fix-for-dns-candidate-queries' into 'master'

fix: native resolver only tries candidate names when server indicates

See merge request os85/httpx!236
This commit is contained in:
HoneyryderChuck 2023-01-21 17:11:26 +00:00
commit a218463c73
5 changed files with 34 additions and 4 deletions

View File

@ -108,7 +108,15 @@ module HTTPX
def decode_dns_answer(payload)
message = Resolv::DNS::Message.decode(payload)
# no domain was found
return if message.rcode == Resolv::DNS::RCode::NXDomain
addresses = []
# TODO: raise an "other dns OtherResolvError" type of error
return addresses if message.rcode != Resolv::DNS::RCode::NoError
message.each_answer do |question, _, value|
case value
when Resolv::DNS::Resource::IN::CNAME

View File

@ -136,9 +136,22 @@ module HTTPX
emit_resolve_error(connection, connection.origin.host, e)
return
end
if answers.nil? || answers.empty?
if answers.nil?
# Indicates no such domain was found.
host = @requests.delete(request)
connection = @queries.delete(host)
emit_resolve_error(connection) unless @queries.value?(connection)
elsif answers.empty?
# no address found, eliminate candidates
host = @requests.delete(request)
connection = @queries.delete(host)
# eliminate other candidates
@queries.delete_if { |_, conn| connection == conn }
emit_resolve_error(connection)
return

View File

@ -215,7 +215,8 @@ module HTTPX
raise ex
end
if addresses.nil? || addresses.empty?
if addresses.nil?
# Indicates no such domain was found.
hostname, connection = @queries.first
@queries.delete(hostname)
@timeouts.delete(hostname)
@ -224,6 +225,14 @@ module HTTPX
@connections.delete(connection)
raise NativeResolveError.new(connection, connection.origin.host)
end
elsif addresses.empty?
# no address found, eliminate candidates
_, connection = @queries.first
candidates = @queries.select { |_, conn| connection == conn }.keys
@queries.delete_if { |hs, _| candidates.include?(hs) }
@timeouts.delete_if { |hs, _| candidates.include?(hs) }
@connections.delete(connection)
raise NativeResolveError.new(connection, connection.origin.host)
else
address = addresses.first
name = address["name"]

View File

@ -30,6 +30,6 @@ module HTTPX
def self?.encode_dns_query: (String hostname, ?type: dns_resource) -> String
def self?.decode_dns_answer: (String) -> Array[dns_result]
def self?.decode_dns_answer: (String) -> Array[dns_result]?
end
end

View File

@ -34,7 +34,7 @@ module HTTPX
def build_request: (String hostname) -> Request
def decode_response_body: (Response) -> Array[dns_result]
def decode_response_body: (Response) -> Array[dns_result]?
end
end
end