class HTTPX::Resolver::HTTPS

  1. lib/httpx/resolver/https.rb
Superclass: Resolver

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.

Methods

Public Class

  1. new

Public Instance

  1. <<
  2. resolver_connection

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