Class: Socketry::Resolver::Resolv

Inherits:
Object
  • Object
show all
Defined in:
lib/socketry/resolver/resolv.rb

Overview

Pure Ruby DNS resolver provided by the standard library

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ Resolv

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



27
28
29
30
# File 'lib/socketry/resolver/resolv.rb', line 27

def initialize(*args)
  @hosts = ::Resolv::Hosts.new
  @resolver = ::Resolv::DNS.new(*args)
end

Class Method Details

.resolve(hostname, **options) ⇒ Object

Resolve a hostname by creating and discaring a Socketry::Resolver::Resolv instance. For better performance, create and reuse an instance.



11
12
13
14
15
16
17
18
# 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

Instance Method Details

#closeObject

Close the resolver



62
63
64
# File 'lib/socketry/resolver/resolv.rb', line 62

def close
  @resolver.close
end

#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:



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# 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