mirror of
https://github.com/HoneyryderChuck/httpx.git
synced 2025-10-06 00:02:08 -04:00
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:
commit
a218463c73
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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"]
|
||||
|
@ -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
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user