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 36 def initialize(_, options) 37 super 38 @resolver_options = DEFAULTS.merge(@options.resolver_options) 39 @queries = {} 40 @requests = {} 41 @uri = URI(@resolver_options[:uri]) 42 @uri_addresses = nil 43 @resolver = Resolv::DNS.new 44 @resolver.timeouts = @resolver_options.fetch(:timeouts, Resolver::RESOLVE_TIMEOUT) 45 @resolver.lazy_initialize 46 end
Public Instance methods
<<(connection)
[show source]
# File lib/httpx/resolver/https.rb 48 def <<(connection) 49 return if @uri.origin == connection.peer.to_s 50 51 @uri_addresses ||= HTTPX::Resolver.nolookup_resolve(@uri.host) || @resolver.getaddresses(@uri.host) 52 53 if @uri_addresses.empty? 54 ex = ResolveError.new("Can't resolve DNS server #{@uri.host}") 55 ex.set_backtrace(caller) 56 connection.force_close 57 throw(:resolve_error, ex) 58 end 59 60 resolve(connection) 61 end
resolver_connection()
[show source]
# File lib/httpx/resolver/https.rb 63 def resolver_connection 64 # TODO: leaks connection object into the pool 65 @resolver_connection ||= 66 @current_session.find_connection( 67 @uri, 68 @current_selector, 69 @options.merge(resolver_class: :system, ssl: { alpn_protocols: %w[h2] }) 70 ).tap do |conn| 71 emit_addresses(conn, @family, @uri_addresses) unless conn.addresses 72 conn.on(:force_closed, &method(:force_close)) 73 end 74 end