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