class HTTPX::Resolver::Native

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

Methods

Public Class

  1. new

Public Instance

  1. <<
  2. call
  3. close
  4. closed?
  5. handle_socket_timeout
  6. interests
  7. state
  8. timeout
  9. to_io

Constants

DEFAULTS = { nameserver: nil, **Resolv::DNS::Config.default_config_hash, packet_size: 512, timeouts: Resolver::RESOLVE_TIMEOUT, }.freeze  
DNS_PORT = 53  

Attributes

state [R]

Public Class methods

new(family, options)
[show source]
   # File lib/httpx/resolver/native.rb
24 def initialize(family, options)
25   super
26   @ns_index = 0
27   @resolver_options = DEFAULTS.merge(@options.resolver_options)
28   @socket_type = @resolver_options.fetch(:socket_type, :udp)
29   @nameserver = if (nameserver = @resolver_options[:nameserver])
30     nameserver = nameserver[family] if nameserver.is_a?(Hash)
31     Array(nameserver)
32   end
33   @ndots = @resolver_options.fetch(:ndots, 1)
34   @search = Array(@resolver_options[:search]).map { |srch| srch.scan(/[^.]+/) }
35   @_timeouts = Array(@resolver_options[:timeouts])
36   @timeouts = Hash.new { |timeouts, host| timeouts[host] = @_timeouts.dup }
37   @connections = []
38   @queries = {}
39   @read_buffer = "".b
40   @write_buffer = Buffer.new(@resolver_options[:packet_size])
41   @state = :idle
42 end

Public Instance methods

<<(connection)
[show source]
    # File lib/httpx/resolver/native.rb
 91 def <<(connection)
 92   if @nameserver.nil?
 93     ex = ResolveError.new("No available nameserver")
 94     ex.set_backtrace(caller)
 95     connection.force_reset
 96     throw(:resolve_error, ex)
 97   else
 98     @connections << connection
 99     resolve
100   end
101 end
call()
[show source]
   # File lib/httpx/resolver/native.rb
56 def call
57   case @state
58   when :open
59     consume
60   end
61   nil
62 rescue Errno::EHOSTUNREACH => e
63   @ns_index += 1
64   nameserver = @nameserver
65   if nameserver && @ns_index < nameserver.size
66     log do
67       "resolver #{FAMILY_TYPES[@record_type]}: " \
68         "failed resolving on nameserver #{@nameserver[@ns_index - 1]} (#{e.message})"
69     end
70     transition(:idle)
71     @timeouts.clear
72   else
73     handle_error(e)
74   end
75 rescue NativeResolveError => e
76   handle_error(e)
77 end
close()
[show source]
   # File lib/httpx/resolver/native.rb
44 def close
45   transition(:closed)
46 end
closed?()
[show source]
   # File lib/httpx/resolver/native.rb
48 def closed?
49   @state == :closed
50 end
handle_socket_timeout(interval)
[show source]
    # File lib/httpx/resolver/native.rb
111 def handle_socket_timeout(interval)
112   do_retry(interval)
113 end
interests()
[show source]
   # File lib/httpx/resolver/native.rb
79 def interests
80   case @state
81   when :idle
82     transition(:open)
83   when :closed
84     transition(:idle)
85     transition(:open)
86   end
87 
88   calculate_interests
89 end
timeout()
[show source]
    # File lib/httpx/resolver/native.rb
103 def timeout
104   return if @connections.empty?
105 
106   @start_timeout = Utils.now
107   hosts = @queries.keys
108   @timeouts.values_at(*hosts).reject(&:empty?).map(&:first).min
109 end
to_io()
[show source]
   # File lib/httpx/resolver/native.rb
52 def to_io
53   @io.to_io
54 end