Skip to content

Instantly share code, notes, and snippets.

@Logioniz
Created September 29, 2015 11:05
Show Gist options
  • Save Logioniz/44044128eb4a94aa7948 to your computer and use it in GitHub Desktop.
Save Logioniz/44044128eb4a94aa7948 to your computer and use it in GitHub Desktop.
Mojo::IOLoop::Net::DNS
#!/usr/bin/perl
package Mojo::IOLoop::Net::DNS;
use Mojo::Base -base;
use Net::DNS;
use Mojo::IOLoop;
use Scalar::Util 'weaken';
sub query {
my $self = shift;
my $cb = ref $_[-1] eq 'CODE' ? pop : undef;
die 'Need set callback' unless $cb;
$self->{cb} = $cb;
my $resolver = $self->{resolver} = Net::DNS::Resolver->new;
$resolver->retrans(2);
$self->{handle} = $resolver->bgsend(@_);
Mojo::IOLoop->singleton->reactor->io($self->{handle} => sub {
my $reactor = shift;
my $result = $self->{resolver}->bgread($self->{handle});
my $cb = delete $self->{cb};
$cb->($result);
$reactor->remove(delete $self->{handle});
delete $self->{resolver};
})->watch($self->{handle}, 1, 0);
}
package main;
use Mojo::IOLoop;
use Data::Dumper;
Mojo::IOLoop->delay(
sub {
my $d = shift;
Mojo::IOLoop::Net::DNS->new->query('disoptorg.ru', 'NS' => $d->begin(0));
Mojo::IOLoop::Net::DNS->new->query('chelseablues.ru', 'NS' => $d->begin(0));
Mojo::IOLoop::Net::DNS->new->query('www.broadwalkfireseals.co.uk', 'NS' => $d->begin(0));
},
sub {
my ($d, $result1, $result2, $result3) = @_;
my @r1 = grep $_, map { $_->can('nsdname') && $_->nsdname } $result1->answer;
my @r2 = grep $_, map { $_->can('nsdname') && $_->nsdname } $result2->answer;
my @r3 = grep $_, map { $_->can('nsdname') && $_->nsdname } $result3->answer;
warn Dumper(\@r1, \@r2, \@r3);
}
)->wait;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment