mirror of
https://github.com/HoneyryderChuck/httpx.git
synced 2025-10-09 00:02:50 -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)
|
def decode_dns_answer(payload)
|
||||||
message = Resolv::DNS::Message.decode(payload)
|
message = Resolv::DNS::Message.decode(payload)
|
||||||
|
|
||||||
|
# no domain was found
|
||||||
|
return if message.rcode == Resolv::DNS::RCode::NXDomain
|
||||||
|
|
||||||
addresses = []
|
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|
|
message.each_answer do |question, _, value|
|
||||||
case value
|
case value
|
||||||
when Resolv::DNS::Resource::IN::CNAME
|
when Resolv::DNS::Resource::IN::CNAME
|
||||||
|
@ -136,9 +136,22 @@ module HTTPX
|
|||||||
emit_resolve_error(connection, connection.origin.host, e)
|
emit_resolve_error(connection, connection.origin.host, e)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
if answers.nil? || answers.empty?
|
|
||||||
|
if answers.nil?
|
||||||
|
# Indicates no such domain was found.
|
||||||
|
|
||||||
host = @requests.delete(request)
|
host = @requests.delete(request)
|
||||||
connection = @queries.delete(host)
|
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)
|
emit_resolve_error(connection)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -215,7 +215,8 @@ module HTTPX
|
|||||||
raise ex
|
raise ex
|
||||||
end
|
end
|
||||||
|
|
||||||
if addresses.nil? || addresses.empty?
|
if addresses.nil?
|
||||||
|
# Indicates no such domain was found.
|
||||||
hostname, connection = @queries.first
|
hostname, connection = @queries.first
|
||||||
@queries.delete(hostname)
|
@queries.delete(hostname)
|
||||||
@timeouts.delete(hostname)
|
@timeouts.delete(hostname)
|
||||||
@ -224,6 +225,14 @@ module HTTPX
|
|||||||
@connections.delete(connection)
|
@connections.delete(connection)
|
||||||
raise NativeResolveError.new(connection, connection.origin.host)
|
raise NativeResolveError.new(connection, connection.origin.host)
|
||||||
end
|
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
|
else
|
||||||
address = addresses.first
|
address = addresses.first
|
||||||
name = address["name"]
|
name = address["name"]
|
||||||
|
@ -30,6 +30,6 @@ module HTTPX
|
|||||||
|
|
||||||
def self?.encode_dns_query: (String hostname, ?type: dns_resource) -> String
|
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
|
||||||
end
|
end
|
@ -34,7 +34,7 @@ module HTTPX
|
|||||||
|
|
||||||
def build_request: (String hostname) -> Request
|
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
|
end
|
||||||
end
|
end
|
Loading…
x
Reference in New Issue
Block a user