Net-DNS

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

	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

Changes  view on Meta::CPAN

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) };



( run in 0.551 second using v1.01-cache-2.11-cpan-3cd7ad12f66 )