Module: Socketry::Resolver::System

Defined in:
lib/socketry/resolver/system.rb

Overview

System DNS resolver backed by the POSIX getaddrinfo(3) function

Class Method Summary collapse

Class Method Details

.resolve(hostname, timeout: nil) ⇒ IPAddr

Resolve a domain name using IPSocket.getaddress. This uses getaddrinfo(3) on POSIX operating systems.

Parameters:

  • hostname (String)

    name of the host whose IP address we’d like to obtain

Returns:

  • (IPAddr)

    resolved IP address

Raises:



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/socketry/resolver/system.rb', line 19

def resolve(hostname, timeout: nil)
  raise TypeError, "expected String, got #{hostname.class}" unless hostname.is_a?(String)

  begin
    case timeout
    when Integer, Float
      # NOTE: ::Timeout is not thread safe. For thread safety, use Socketry::Resolver::Resolv
      result = ::Timeout.timeout(timeout) { IPSocket.getaddress(hostname) }
    when NilClass
      result = IPSocket.getaddress(hostname)
    else raise TypeError, "expected Numeric, got #{timeout.class}"
    end
  rescue ::SocketError => ex
    raise Socketry::Resolver::Error, ex.message, ex.backtrace
  rescue ::Timeout::Error => ex
    raise Socketry::TimeoutError, ex.message, ex.backtrace
  end

  begin
    IPAddr.new(result)
  rescue IPAddr::InvalidAddressError => ex
    raise Socketry::AddressError, ex.message, ex.backtrace
  end
end