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
25 26 27 28 |
# File 'lib/socketry/resolver/resolv.rb', line 25 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.
9 10 11 12 13 14 15 16 |
# File 'lib/socketry/resolver/resolv.rb', line 9 def self.resolve(hostname, **) resolver = new begin resolver.resolve(hostname, **) ensure resolver.close end end |
Instance Method Details
#close ⇒ Object
Close the resolver
60 61 62 |
# File 'lib/socketry/resolver/resolv.rb', line 60 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.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/socketry/resolver/resolv.rb', line 38 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 # 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 |