IO-Async
view release on metacpan or search on metacpan
lib/IO/Async/Resolver.pm view on Meta::CPAN
host => "www.example.com",
service => "http",
);
foreach my $addr ( @results ) {
printf "http://www.example.com can be reached at " .
"socket(%d,%d,%d) + connect('%v02x')\n",
@{$addr}{qw( family socktype protocol addr )};
}
my @pwent = await $loop->resolve( type => 'getpwuid', data => [ $< ] );
print "My passwd ent: " . join( "|", @pwent ) . "\n";
=head1 DESCRIPTION
This module extends an L<IO::Async::Loop> to use the system's name resolver
functions asynchronously. It provides a number of named resolvers, each one
providing an asynchronous wrapper around a single resolver function.
Because the system may not provide asynchronous versions of its resolver
lib/IO/Async/Resolver.pm view on Meta::CPAN
croak "Already have a resolver method called '$name'" if exists $METHODS{$name};
$METHODS{$name} = $code;
}
=head1 BUILT-IN RESOLVERS
The following resolver names are implemented by the same-named perl function,
taking and returning a list of values exactly as the perl function does:
getpwnam getpwuid
getgrnam getgrgid
getservbyname getservbyport
gethostbyname gethostbyaddr
getnetbyname getnetbyaddr
getprotobyname getprotobynumber
=cut
# Now register the inbuilt methods
register_resolver getpwnam => sub { my @r = getpwnam( $_[0] ) or die "$!\n"; @r };
register_resolver getpwuid => sub { my @r = getpwuid( $_[0] ) or die "$!\n"; @r };
register_resolver getgrnam => sub { my @r = getgrnam( $_[0] ) or die "$!\n"; @r };
register_resolver getgrgid => sub { my @r = getgrgid( $_[0] ) or die "$!\n"; @r };
register_resolver getservbyname => sub { my @r = getservbyname( $_[0], $_[1] ) or die "$!\n"; @r };
register_resolver getservbyport => sub { my @r = getservbyport( $_[0], $_[1] ) or die "$!\n"; @r };
register_resolver gethostbyname => sub { my @r = gethostbyname( $_[0] ) or die "$!\n"; @r };
register_resolver gethostbyaddr => sub { my @r = gethostbyaddr( $_[0], $_[1] ) or die "$!\n"; @r };
t/50resolver.t view on Meta::CPAN
my $loop = IO::Async::Loop->new_builtin;
testing_loop( $loop );
my $resolver = $loop->resolver;
isa_ok( $resolver, [ "IO::Async::Resolver" ], '$loop->resolver isa IO::Async::Resolver' );
SKIP: {
my @pwuid;
defined eval { @pwuid = getpwuid( $< ) } or
skip "No getpwuid()", 5;
{
my $future = $resolver->resolve(
type => 'getpwuid',
data => [ $< ],
);
isa_ok( $future, [ "Future" ], '$future isa Future' );
wait_for { $future->is_ready };
my @result = $future->get;
is( \@result, \@pwuid, 'getpwuid from future' );
}
{
my $result;
$resolver->resolve(
type => 'getpwuid',
data => [ $< ],
on_resolved => sub { $result = [ @_ ] },
on_error => sub { die "Test died early" },
);
wait_for { $result };
is( $result, \@pwuid, 'getpwuid' );
}
{
my $result;
$loop->resolve(
type => 'getpwuid',
data => [ $< ],
on_resolved => sub { $result = [ @_ ] },
on_error => sub { die "Test died early" },
);
wait_for { $result };
is( $result, \@pwuid, 'getpwuid via $loop->resolve' );
}
SKIP: {
my $user_name = $pwuid[0];
skip "getpwnam - No user name", 1 unless defined $user_name;
my @pwnam = getpwnam( $user_name );
my $result;
t/50resolver.t view on Meta::CPAN
sub resolve {
$callcount++; return Future->done();
}
sub getaddrinfo {}
sub getnameinfo {}
}
$loop->set_resolver( MockResolver->new );
$loop->resolve( type => "getpwuid", data => [ 0 ] )->get;
is( $callcount, 1, '$callcount 1 after ->resolve' );
}
done_testing;
( run in 0.289 second using v1.01-cache-2.11-cpan-8d75d55dd25 )