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   @_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