Class: Socketry::Resolver::Resolv
- Inherits:
-
Object
- Object
- Socketry::Resolver::Resolv
- Defined in:
- lib/socketry/resolver/resolv.rb
Overview
Pure Ruby DNS resolver provided by the standard library
Class Method Summary collapse
-
.resolve(hostname, **options) ⇒ Object
Resolve a hostname by creating and discaring a Socketry::Resolver::Resolv instance.
Instance Method Summary collapse
-
#close ⇒ Object
Close the resolver.
-
#initialize(*args) ⇒ Resolv
constructor
Create a new instance of Socketry::Resolver::Resolv.
-
#resolve(hostname, timeout: nil) ⇒ IPAddr
Resolve a domain name using IPSocket.getaddress.
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, **) resolver = new begin resolver.resolve(hostname, **) ensure resolver.close end end |
Instance Method Details
#close ⇒ Object
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.
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., ex.backtrace rescue ::Resolv::ResolvTimeout => ex raise Socketry::TimeoutError, ex., ex.backtrace end end |