view release on metacpan or search on metacpan
Facilitate decoding of mDNS/SD packets with compressed RDATA.
Update Parameters.pm to resync with IANA registry.
Fix rt.cpan.org #150550
Error trying to use Socket macro SO_REUSEPORT in Windows
**** 1.40 Aug 30, 2023
Add support for SVCB dohpath and ohttp parameters.
More robust test of bgbusy() SpamAssassin workaround.
Fix rt.cpan.org #149456
t/05-SOA.t test fails in 2038
Fix rt.cpan.org #149280
Deep recursion on subroutine "Net::DNS::Resolver::Recurse::_recurse"
**** 1.39 Jun 1, 2023
Net::DNS::Resolver::axfr_old() has been removed from the package.
An exception will be thrown if you attempt to use this method. Use
axfr() or axfr_start() instead.
*** 0.40 September 1, 2003
Various POD tweaks.
** 0.39_02 August 28, 2003
Net-DNS-SEC updates, seems that IETF has been busy redefining DNSSEC.
[Olaf]
Added version to all the modules in the distribution.
** 0.39_01 August 12 2003
Added a META.yaml. The crystal ball says an upgrade to Module::Install may
be coming soon.
Changed how the versions of the various submodules were set. The CPAN
lib/Net/DNS.pm view on Meta::CPAN
=head2 Perform a background query and print the reply.
use Net::DNS;
my $res = Net::DNS::Resolver->new;
$res->udp_timeout(10);
$res->tcp_timeout(20);
my $socket = $res->bgsend( "www.example.com", "AAAA" );
while ( $res->bgbusy($socket) ) {
# do some work here whilst awaiting the response
# ...and some more here
}
my $packet = $res->bgread($socket);
die "query failed: ", $res->errorstring unless $packet;
$packet->print;
lib/Net/DNS/Resolver.pm view on Meta::CPAN
Performs a background DNS query for the given name and returns immediately
without waiting for the response. The program can then perform other tasks
while awaiting the response from the nameserver.
The argument list can be either a L<Net::DNS::Packet> object or a list
of strings. The record type and class can be omitted; they default to
A and IN. If the name looks like an IP address (IPv4 or IPv6),
then a query within in-addr.arpa or ip6.arpa will be performed.
Returns an opaque handle which is passed to subsequent invocations of
the C<bgbusy()> and C<bgread()> methods.
Errors are indicated by returning C<undef> in which case
the reason for failure may be determined using C<errorstring()>.
The response L<Net::DNS::Packet> object is obtained by calling C<bgread()>.
B<BEWARE>:
Programs should make no assumptions about the nature of the handles
returned by C<bgsend()> which should be used strictly as described here.
lib/Net/DNS/Resolver.pm view on Meta::CPAN
$handle = $resolver->bgsend( 'www.example.com' );
$packet = $resolver->bgread($handle);
Reads the response following a background query.
The argument is the handle returned by C<bgsend()>.
Returns a L<Net::DNS::Packet> object or C<undef> if no response was
received before the timeout interval expired.
=head2 bgbusy
$handle = $resolver->bgsend( 'foo.example.com' );
while ($resolver->bgbusy($handle)) {
...
}
$packet = $resolver->bgread($handle);
Returns true while awaiting the response or for the transaction to time out.
The argument is the handle returned by C<bgsend()>.
Truncated UDP packets will be retried transparently using TCP while
continuing to assert busy to the caller.
=head2 debug
print 'debug flag: ', $resolver->debug, "\n";
$resolver->debug(1);
Get or set the debug flag.
If set, calls to C<search()>, C<query()>, and C<send()> will print
debugging information on the standard output.
lib/Net/DNS/Resolver/Base.pm view on Meta::CPAN
my $expire = time() + $self->{udp_timeout};
${*$socket}{net_dns_bg} = [$expire, $packet];
return $socket;
}
return;
}
sub bgbusy { ## no critic # overwrites user UDP handle
my ( $self, $handle ) = @_;
return unless $handle;
my $appendix = ${*$handle}{net_dns_bg} ||= [time() + $self->{udp_timeout}];
my ( $expire, $query, $read ) = @$appendix;
return if ref($read);
return time() < $expire unless IO::Select->new($handle)->can_read(0.02); # limit CPU burn
return unless $query; # SpamAssassin 3.4.1 workaround
lib/Net/DNS/Resolver/Base.pm view on Meta::CPAN
return if $self->{igntc};
return unless $ans->header->tc;
$self->_diag('packet truncated: retrying using TCP');
my $tcp = $self->_bgsend_tcp( $query, $query->encode ) || return;
return defined( $_[1] = $tcp ); # caller's UDP handle now TCP
}
sub bgisready { ## historical
__PACKAGE__->_deprecate('prefer ! bgbusy(...)'); # uncoverable pod
return !&bgbusy;
}
sub bgread {
1 while &bgbusy; ## side effect: TCP retry if TC flag set
return &_bgread;
}
sub _bgread {
my ( $self, $handle ) = @_;
return unless $handle;
my $appendix = ${*$handle}{net_dns_bg};
my ( $expire, $query, $read ) = @$appendix;
lib/Net/DNS/Resolver/Base.pm view on Meta::CPAN
sub-classes of L<Net::DNS::Resolver>.
No user serviceable parts inside, see L<Net::DNS::Resolver>
for all your resolving needs.
=head1 METHODS
=head2 new, domain, searchlist, nameserver, nameservers,
=head2 search, query, send, bgsend, bgbusy, bgread, axfr,
=head2 force_v4, force_v6, prefer_v4, prefer_v6,
=head2 dnssec, srcaddr, tsig, udppacketsize,
=head2 print, string, errorstring, replyfrom
See L<Net::DNS::Resolver>.
t/01-resolver.t view on Meta::CPAN
is( scalar( Net::DNS::Resolver::Base::_cname_addr( undef, undef ) ), 0, '_cname_addr() no reply packet' );
$resolver->nameservers(); ## exercise UDP failure path
ok( !$resolver->send('.'), 'no UDP nameservers' );
$resolver->nameservers(@NOIP);
ok( !$resolver->send('.'), '$resolver->send UDP socket error' );
ok( !$resolver->bgsend('.'), '$resolver->bgsend UDP socket error' );
ok( !$resolver->bgbusy(), '$resolver->bgbusy undefined handle' );
ok( !$resolver->_bgread(), '$resolver->_bgread undefined handle' );
$resolver->usevc(1); ## exercise TCP failure path
$resolver->nameservers();
ok( !$resolver->send('.'), 'no TCP nameservers' );
$resolver->nameservers(@NOIP);
ok( !$resolver->send('.'), '$resolver->send TCP socket error' );
ok( !$resolver->bgsend('.'), '$resolver->bgsend TCP socket error' );
t/01-resolver.t view on Meta::CPAN
ok( !$recursive->send( "www.$domain", 'A' ), 'fail if no usable hint' );
exception( 'deprecated query_dorecursion()', sub { $recursive->query_dorecursion("www.$domain") } );
exception( 'deprecated recursion_callback()', sub { $recursive->recursion_callback(undef) } );
}
SKIP: {
skip( 'Unable to emulate SpamAssassin socket usage', 1 ) if $^O eq 'MSWin32';
my $handle = \*DATA; ## exercise SpamAssassin's use of plain sockets
ok( !$resolver->bgbusy($handle), 'bgbusy(): SpamAssassin workaround' );
}
exit;
__DATA__
arbitrary
t/08-IPv4.t view on Meta::CPAN
{
my $resolver = Net::DNS::Resolver->new( nameservers => $IP );
$resolver->igntc(0);
my $packet = Net::DNS::Packet->new(qw(net-dns.org SOA IN));
my $udp = $resolver->bgsend($packet);
ok( $udp, '$resolver->bgsend(...) UDP' );
while ( $resolver->bgbusy($udp) ) { sleep 1; }
ok( $resolver->bgread($udp), '$resolver->bgread($udp)' );
$packet->edns->option( PADDING => ( 'OPTION-LENGTH' => 500 ) ); # force TCP
delete $packet->{id};
my $tcp = $resolver->bgsend($packet);
ok( $tcp, '$resolver->bgsend(...) TCP' );
while ( $resolver->bgbusy($tcp) ) { sleep 1; }
ok( $resolver->bgread($tcp), '$resolver->bgread($tcp)' );
}
{
my $resolver = Net::DNS::Resolver->new( nameservers => $IP );
$resolver->dnssec(1);
$resolver->udppacketsize(513);
$resolver->igntc(1);
t/08-IPv4.t view on Meta::CPAN
{
my $resolver = Net::DNS::Resolver->new( nameservers => $IP );
$resolver->dnssec(1);
$resolver->udppacketsize(513);
$resolver->igntc(0);
my $handle = $resolver->bgsend(qw(net-dns.org DNSKEY IN));
ok( $handle, '$resolver->bgsend(...) truncated UDP' );
my $udp = $handle;
my $packet = $resolver->bgread($handle);
isnt( $handle, $udp, '$resolver->bgbusy($udp) handle changed to TCP' );
ok( $packet && !$packet->header->tc, '$resolver->bgread($udp) background TCP retry' );
}
{
my $resolver = Net::DNS::Resolver->new( nameservers => $IP );
$resolver->dnssec(1);
$resolver->udppacketsize(513);
$resolver->igntc(0);
t/08-IPv4.t view on Meta::CPAN
{ ## exercise error paths in _axfr_next()
my $resolver = Net::DNS::Resolver->new( nameservers => $IP );
$resolver->tcp_timeout(10);
exception( 'TCP time out', sub { $resolver->_axfr_next( IO::Select->new ) } );
my $packet = Net::DNS::Packet->new(qw(net-dns.org SOA));
my $socket = $resolver->_bgsend_tcp( $packet, $packet->encode );
my $select = IO::Select->new($socket);
while ( $resolver->bgbusy($socket) ) { sleep 1 }
my $discarded = ''; ## [size][id][status] [qdcount]...
$socket->recv( $discarded, 6 ) if $socket;
exception( 'corrupt data', sub { $resolver->_axfr_next($select) } );
}
SKIP: {
my $resolver = Net::DNS::Resolver->new( nameservers => $IP );
$resolver->domain('net-dns.org');
eval { $resolver->tsig($tsig_key) };
t/08-IPv6.t view on Meta::CPAN
{
my $resolver = Net::DNS::Resolver->new( nameservers => $IP );
$resolver->igntc(0);
my $packet = Net::DNS::Packet->new(qw(net-dns.org SOA IN));
my $udp = $resolver->bgsend($packet);
ok( $udp, '$resolver->bgsend(...) UDP' );
while ( $resolver->bgbusy($udp) ) { sleep 1; }
ok( $resolver->bgread($udp), '$resolver->bgread($udp)' );
$packet->edns->option( PADDING => ( 'OPTION-LENGTH' => 500 ) ); # force TCP
delete $packet->{id};
my $tcp = $resolver->bgsend($packet);
ok( $tcp, '$resolver->bgsend(...) TCP' );
while ( $resolver->bgbusy($tcp) ) { sleep 1; }
ok( $resolver->bgread($tcp), '$resolver->bgread($tcp)' );
}
{
my $resolver = Net::DNS::Resolver->new( nameservers => $IP );
$resolver->dnssec(1);
$resolver->udppacketsize(513);
$resolver->igntc(1);
t/08-IPv6.t view on Meta::CPAN
{
my $resolver = Net::DNS::Resolver->new( nameservers => $IP );
$resolver->dnssec(1);
$resolver->udppacketsize(513);
$resolver->igntc(0);
my $handle = $resolver->bgsend(qw(net-dns.org DNSKEY IN));
ok( $handle, '$resolver->bgsend(...) truncated UDP' );
my $udp = $handle;
my $packet = $resolver->bgread($handle);
isnt( $handle, $udp, '$resolver->bgbusy($udp) handle changed to TCP' );
ok( $packet && !$packet->header->tc, '$resolver->bgread($udp) background TCP retry' );
}
{
my $resolver = Net::DNS::Resolver->new( nameservers => $IP );
$resolver->dnssec(1);
$resolver->udppacketsize(513);
$resolver->igntc(0);
t/08-IPv6.t view on Meta::CPAN
{ ## exercise error paths in _axfr_next()
my $resolver = Net::DNS::Resolver->new( nameservers => $IP );
$resolver->tcp_timeout(10);
exception( 'TCP time out', sub { $resolver->_axfr_next( IO::Select->new ) } );
my $packet = Net::DNS::Packet->new(qw(net-dns.org SOA));
my $socket = $resolver->_bgsend_tcp( $packet, $packet->encode );
my $select = IO::Select->new($socket);
while ( $resolver->bgbusy($socket) ) { sleep 1 }
my $discarded = ''; ## [size][id][status] [qdcount]...
$socket->recv( $discarded, 6 ) if $socket;
exception( 'corrupt data', sub { $resolver->_axfr_next($select) } );
}
SKIP: {
my $resolver = Net::DNS::Resolver->new( nameservers => $IP );
$resolver->domain('net-dns.org');
eval { $resolver->tsig($tsig_key) };