module Socketry::Resolver::DEFAULT_RESOLVER

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

Public Instance Methods

resolve(hostname, timeout: nil) click to toggle source

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

@param hostname [String] name of the host whose IP address we'd like to obtain @return [IPAddr] resolved IP address @raise [Socketry::Resolver::Error] an error occurred resolving the domain name @raise [Socketry::TimeoutError] a timeout occured before the name could be resolved @raise [Socketry::AddressError] the name was resolved to an unsupported address

# 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