Google-DNS
view release on metacpan or search on metacpan
lib/Google/DNS.pm view on Meta::CPAN
package Google::DNS;
use strict;
use warnings;
use Carp qw/croak/;
use URI::Escape qw/uri_escape/;
use HTTP::Tiny;
use JSON::PP qw/decode_json/;
use Class::Accessor::Lite (
rw => [qw/
cd
type
endpoint
ua
/],
);
our $VERSION = '0.02';
sub new {
my $class = shift;
my %args = @_;
bless {
cd => ($args{cd} || $args{dnssec}) ? 1 : 0,
type => $args{type} || '',
endpoint => $args{endpoint} || 'https://dns.google.com/resolve',
ua => $args{ua} || HTTP::Tiny->new,
}, $class;
}
sub resolve {
my ($self, $domain, $raw) = @_;
croak "require domain" unless $domain;
my %query = (name => $domain);
if ($self->cd) {
$query{cd} = $self->cd;
}
if ($self->type) {
$query{type} = $self->type;
}
my $query_string = join('&', map { uri_escape($_).'='.uri_escape($query{$_}) } keys %query);
my $res = $self->ua->get($self->endpoint.'?'. $query_string);
croak "wrong response:$res->{status} $res->{reason}" unless $res->{success};
my $json = $res->{content};
return $json if $raw;
return decode_json($json);
}
sub data {
my ($self, $domain, $delimi) = @_;
unless (defined $delimi) {
$delimi = "\n";
}
my $hash = $self->resolve($domain);
return join($delimi, map { $_->{data} } @{$hash->{Answer}});
}
1;
__END__
=encoding UTF-8
=head1 NAME
Google::DNS - resolve domain name by Google Public DNS
=head1 SYNOPSIS
use Google::DNS;
my $resolver = Google::DNS->new;
# all response
my $hash = $resolver->resolve('google.com');
# only data in Answer section
my $data = $resolver->data('google.com');
=head1 DESCRIPTION
Google::DNS is the DNS resolver by Google Public DNS.
NOTE that Google says Public DNS Query UI is Beta, so this module is Beta also.
=head1 METHODS
=head2 new(%options)
=head2 resolve($domain)
=head2 data($domain)
=head1 CLI
( run in 2.606 seconds using v1.01-cache-2.11-cpan-d8267643d1d )