fix: use Socket getaddrinfo for host resolution
This commit is contained in:
@@ -4,8 +4,8 @@ use Mojo::Base -base;
|
|||||||
use Mojo::URL;
|
use Mojo::URL;
|
||||||
use Mojo::UserAgent;
|
use Mojo::UserAgent;
|
||||||
use Mojo::Promise;
|
use Mojo::Promise;
|
||||||
use Mojo::IOLoop;
|
|
||||||
use Urupam::Utils qw(sanitize_url);
|
use Urupam::Utils qw(sanitize_url);
|
||||||
|
use Socket qw(getaddrinfo getnameinfo NI_NUMERICHOST NI_NUMERICSERV AF_INET AF_INET6 SOCK_STREAM);
|
||||||
|
|
||||||
my $MAX_URL_LENGTH = 2048;
|
my $MAX_URL_LENGTH = 2048;
|
||||||
my $CONNECT_TIMEOUT = 10;
|
my $CONNECT_TIMEOUT = 10;
|
||||||
@@ -156,46 +156,25 @@ sub _resolve_host {
|
|||||||
[ { type => 'ipv6', ip => $ipv6_host } ] );
|
[ { type => 'ipv6', ip => $ipv6_host } ] );
|
||||||
}
|
}
|
||||||
|
|
||||||
my $loop = Mojo::IOLoop->singleton;
|
my ( $err, @results ) =
|
||||||
my $resolver = $loop->resolver;
|
getaddrinfo( $host, undef, { socktype => SOCK_STREAM } );
|
||||||
|
return Mojo::Promise->resolve([]) if $err;
|
||||||
|
|
||||||
my @addresses;
|
my @addresses;
|
||||||
|
for my $res (@results) {
|
||||||
|
my ( $hostnum, undef ) =
|
||||||
|
getnameinfo( $res->{addr}, NI_NUMERICHOST | NI_NUMERICSERV );
|
||||||
|
next unless defined $hostnum && length $hostnum;
|
||||||
|
|
||||||
my $promise = Mojo::Promise->new;
|
if ( $res->{family} == AF_INET ) {
|
||||||
my $pending = 2;
|
push @addresses, { type => 'ipv4', ip => $hostnum };
|
||||||
my $done = sub {
|
}
|
||||||
$pending--;
|
elsif ( $res->{family} == AF_INET6 ) {
|
||||||
if ( $pending == 0 ) {
|
push @addresses, { type => 'ipv6', ip => $hostnum };
|
||||||
$promise->resolve( \@addresses );
|
}
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
$resolver->resolve(
|
return Mojo::Promise->resolve( \@addresses );
|
||||||
$host => sub {
|
|
||||||
my ( $resolver, $err, @results ) = @_;
|
|
||||||
if ( !$err && @results ) {
|
|
||||||
for my $result (@results) {
|
|
||||||
push @addresses,
|
|
||||||
{ type => 'ipv4', ip => $result->{address} };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$done->();
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
$resolver->resolve(
|
|
||||||
$host => { type => 'AAAA' } => sub {
|
|
||||||
my ( $resolver, $err, @results ) = @_;
|
|
||||||
if ( !$err && @results ) {
|
|
||||||
for my $result (@results) {
|
|
||||||
push @addresses,
|
|
||||||
{ type => 'ipv6', ip => $result->{address} };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$done->();
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
return $promise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub is_blocked_url {
|
sub is_blocked_url {
|
||||||
|
|||||||
Reference in New Issue
Block a user