class Socketry::Resolver::Resolv
Pure Ruby DNS resolver provided by the standard library
Public Class Methods
Create a new instance of Socketry::Resolver::Resolv
.
Arguments are passed directly to Resolv::DNS. See the Ruby documentation for more information:
ruby-doc.org/stdlib-2.3.1/libdoc/resolv/rdoc/Resolv/DNS.html
# File lib/socketry/resolver/resolv.rb, line 27 def initialize(*args) @hosts = ::Resolv::Hosts.new @resolver = ::Resolv::DNS.new(*args) end
Resolve a hostname by creating and discaring a Socketry::Resolver::Resolv
instance. For better performance, create and reuse an instance.
# File lib/socketry/resolver/resolv.rb, line 11 def self.resolve(hostname, **options) resolver = new begin resolver.resolve(hostname, **options) ensure resolver.close end end
Public Instance Methods
Close the resolver
# File lib/socketry/resolver/resolv.rb, line 62 def close @resolver.close end
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/resolv.rb, line 40 def resolve(hostname, timeout: nil) raise TypeError, "expected String, got #{hostname.class}" unless hostname.is_a?(String) return IPAddr.new(@hosts.getaddress(hostname).sub(/%.*$/, "")) rescue ::Resolv::ResolvError case timeout when Integer, Float @resolver.timeouts = timeout when NilClass nil # no timeout else raise TypeError, "expected Numeric, got #{timeout.class}" end begin IPAddr.new(@resolver.getaddress(hostname).to_s) rescue ::Resolv::ResolvError => ex raise Socketry::Resolver::Error, ex.message, ex.backtrace rescue ::Resolv::ResolvTimeout => ex raise Socketry::TimeoutError, ex.message, ex.backtrace end end