Implementation of a DoH name resolver (www.youtube.com/watch?v=unMXvnY2FNM). It wraps an HTTPX::Connection
object which integrates with the main session in the same manner as other performed HTTP requests.
Classes and Modules
Constants
DEFAULTS | = | { uri: NAMESERVER, use_get: false, }.freeze | ||
NAMESERVER | = | "https://1.1.1.1/dns-query" |
Public Class methods
new(_, options)
[show source]
# File lib/httpx/resolver/https.rb 35 def initialize(_, options) 36 super 37 @resolver_options = DEFAULTS.merge(@options.resolver_options) 38 @queries = {} 39 @requests = {} 40 @uri = URI(@resolver_options[:uri]) 41 @uri_addresses = nil 42 @resolver = Resolv::DNS.new 43 @resolver.timeouts = @resolver_options.fetch(:timeouts, Resolver::RESOLVE_TIMEOUT) 44 @resolver.lazy_initialize 45 end
Public Instance methods
<<(connection)
[show source]
# File lib/httpx/resolver/https.rb 47 def <<(connection) 48 return if @uri.origin == connection.peer.to_s 49 50 @uri_addresses ||= HTTPX::Resolver.nolookup_resolve(@uri.host) || @resolver.getaddresses(@uri.host) 51 52 if @uri_addresses.empty? 53 ex = ResolveError.new("Can't resolve DNS server #{@uri.host}") 54 ex.set_backtrace(caller) 55 connection.force_reset 56 throw(:resolve_error, ex) 57 end 58 59 resolve(connection) 60 end
resolver_connection()
[show source]
# File lib/httpx/resolver/https.rb 70 def resolver_connection 71 # TODO: leaks connection object into the pool 72 @resolver_connection ||= @current_session.find_connection(@uri, @current_selector, 73 @options.merge(ssl: { alpn_protocols: %w[h2] })).tap do |conn| 74 emit_addresses(conn, @family, @uri_addresses) unless conn.addresses 75 end 76 end