fix: use Socket getaddrinfo for host resolution

This commit is contained in:
2025-12-29 15:13:46 +01:00
parent e9c298110d
commit 0b277a3e65

View File

@@ -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--;
if ( $pending == 0 ) {
$promise->resolve( \@addresses );
} }
}; elsif ( $res->{family} == AF_INET6 ) {
push @addresses, { type => 'ipv6', ip => $hostnum };
$resolver->resolve(
$host => sub {
my ( $resolver, $err, @results ) = @_;
if ( !$err && @results ) {
for my $result (@results) {
push @addresses,
{ type => 'ipv4', ip => $result->{address} };
}
}
$done->();
} }
); }
$resolver->resolve( return Mojo::Promise->resolve( \@addresses );
$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 {