mirror of
https://github.com/HoneyryderChuck/httpx.git
synced 2025-11-28 00:02:22 -05:00
exposing original hostname in errors when there's a dns error in a candidate name for resolution
This commit is contained in:
parent
0490175835
commit
64f8ebcf51
@ -98,24 +98,24 @@ module HTTPX
|
|||||||
request = build_request(hostname)
|
request = build_request(hostname)
|
||||||
request.on(:response, &method(:on_response).curry(2)[request])
|
request.on(:response, &method(:on_response).curry(2)[request])
|
||||||
request.on(:promise, &method(:on_promise))
|
request.on(:promise, &method(:on_promise))
|
||||||
@requests[request] = connection
|
@requests[request] = hostname
|
||||||
resolver_connection.send(request)
|
resolver_connection.send(request)
|
||||||
@connections << connection
|
@connections << connection
|
||||||
rescue ResolveError, Resolv::DNS::EncodeError, JSON::JSONError => e
|
rescue ResolveError, Resolv::DNS::EncodeError, JSON::JSONError => e
|
||||||
@queries.delete(hostname)
|
@queries.delete(hostname)
|
||||||
emit_resolve_error(connection, hostname, e)
|
emit_resolve_error(connection, connection.origin.host, e)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def on_response(request, response)
|
def on_response(request, response)
|
||||||
response.raise_for_status
|
response.raise_for_status
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
connection = @requests[request]
|
hostname = @requests.delete(request)
|
||||||
hostname = @queries.key(connection)
|
connection = @queries.delete(hostname)
|
||||||
emit_resolve_error(connection, hostname, e)
|
emit_resolve_error(connection, connection.origin.host, e)
|
||||||
else
|
else
|
||||||
# @type var response: HTTPX::Response
|
# @type var response: HTTPX::Response
|
||||||
parse(response)
|
parse(request, response)
|
||||||
ensure
|
ensure
|
||||||
@requests.delete(request)
|
@requests.delete(request)
|
||||||
end
|
end
|
||||||
@ -125,22 +125,21 @@ module HTTPX
|
|||||||
stream.refuse
|
stream.refuse
|
||||||
end
|
end
|
||||||
|
|
||||||
def parse(response)
|
def parse(request, response)
|
||||||
begin
|
begin
|
||||||
answers = decode_response_body(response)
|
answers = decode_response_body(response)
|
||||||
rescue Resolv::DNS::DecodeError, JSON::JSONError => e
|
rescue Resolv::DNS::DecodeError, JSON::JSONError => e
|
||||||
host, connection = @queries.first
|
host, connection = @queries.first
|
||||||
@queries.delete(host)
|
@queries.delete(host)
|
||||||
emit_resolve_error(connection, host, e)
|
emit_resolve_error(connection, connection.origin.host, e)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
if answers.nil? || answers.empty?
|
if answers.nil? || answers.empty?
|
||||||
host, connection = @queries.shift
|
host = @requests.delete(request)
|
||||||
|
connection = @queries.delete(host)
|
||||||
|
emit_resolve_error(connection)
|
||||||
|
return
|
||||||
|
|
||||||
unless @queries.value?(connection)
|
|
||||||
emit_resolve_error(connection, host)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
else
|
else
|
||||||
answers = answers.group_by { |answer| answer["name"] }
|
answers = answers.group_by { |answer| answer["name"] }
|
||||||
answers.each do |hostname, addresses|
|
answers.each do |hostname, addresses|
|
||||||
|
|||||||
@ -159,7 +159,7 @@ module HTTPX
|
|||||||
@connections.delete(connection)
|
@connections.delete(connection)
|
||||||
# This loop_time passed to the exception is bogus. Ideally we would pass the total
|
# This loop_time passed to the exception is bogus. Ideally we would pass the total
|
||||||
# resolve timeout, including from the previous retries.
|
# resolve timeout, including from the previous retries.
|
||||||
raise ResolveTimeoutError.new(loop_time, "Timed out while resolving #{host}")
|
raise ResolveTimeoutError.new(loop_time, "Timed out while resolving #{connection.origin.host}")
|
||||||
else
|
else
|
||||||
log { "resolver: timeout after #{timeout}s, retry(#{@timeouts[host].first}) #{host}..." }
|
log { "resolver: timeout after #{timeout}s, retry(#{@timeouts[host].first}) #{host}..." }
|
||||||
resolve(connection)
|
resolve(connection)
|
||||||
@ -195,7 +195,7 @@ module HTTPX
|
|||||||
@queries.delete(hostname)
|
@queries.delete(hostname)
|
||||||
@timeouts.delete(hostname)
|
@timeouts.delete(hostname)
|
||||||
@connections.delete(connection)
|
@connections.delete(connection)
|
||||||
ex = NativeResolveError.new(connection, hostname, e.message)
|
ex = NativeResolveError.new(connection, connection.origin.host, e.message)
|
||||||
ex.set_backtrace(e.backtrace)
|
ex.set_backtrace(e.backtrace)
|
||||||
raise ex
|
raise ex
|
||||||
end
|
end
|
||||||
@ -207,7 +207,7 @@ module HTTPX
|
|||||||
|
|
||||||
unless @queries.value?(connection)
|
unless @queries.value?(connection)
|
||||||
@connections.delete(connection)
|
@connections.delete(connection)
|
||||||
raise NativeResolveError.new(connection, hostname)
|
raise NativeResolveError.new(connection, connection.origin.host)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
address = addresses.first
|
address = addresses.first
|
||||||
|
|||||||
@ -8,7 +8,7 @@ module HTTPX
|
|||||||
|
|
||||||
@family: ip_family
|
@family: ip_family
|
||||||
@options: Options
|
@options: Options
|
||||||
@requests: Hash[Request, Connection]
|
@requests: Hash[Request, String]
|
||||||
@connections: Array[Connection]
|
@connections: Array[Connection]
|
||||||
@uri: URI::Generic
|
@uri: URI::Generic
|
||||||
@uri_addresses: Array[String]?
|
@uri_addresses: Array[String]?
|
||||||
@ -29,7 +29,7 @@ module HTTPX
|
|||||||
|
|
||||||
def on_response: (Request, response) -> void
|
def on_response: (Request, response) -> void
|
||||||
|
|
||||||
def parse: (Response response) -> void
|
def parse: (Request request, Response response) -> void
|
||||||
|
|
||||||
def build_request: (String hostname) -> Request
|
def build_request: (String hostname) -> Request
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user