From 407289cd2a3fbc73a92f0406b411346ca7a81135 Mon Sep 17 00:00:00 2001 From: Kharec Date: Mon, 29 Dec 2025 15:25:08 +0100 Subject: [PATCH] fix: head/get reachability fallback --- lib/Urupam/Validation.pm | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/lib/Urupam/Validation.pm b/lib/Urupam/Validation.pm index f9535fc..2076237 100644 --- a/lib/Urupam/Validation.pm +++ b/lib/Urupam/Validation.pm @@ -5,7 +5,8 @@ use Mojo::URL; use Mojo::UserAgent; use Mojo::Promise; use Urupam::Utils qw(sanitize_url); -use Socket qw(getaddrinfo getnameinfo NI_NUMERICHOST NI_NUMERICSERV AF_INET AF_INET6 SOCK_STREAM); +use Socket + qw(getaddrinfo getnameinfo NI_NUMERICHOST NI_NUMERICSERV AF_INET AF_INET6 SOCK_STREAM); my $MAX_URL_LENGTH = 2048; my $CONNECT_TIMEOUT = 10; @@ -158,7 +159,7 @@ sub _resolve_host { my ( $err, @results ) = getaddrinfo( $host, undef, { socktype => SOCK_STREAM } ); - return Mojo::Promise->resolve([]) if $err; + return Mojo::Promise->resolve( [] ) if $err; my @addresses; for my $res (@results) { @@ -231,6 +232,24 @@ sub check_url_reachable { my $code = $tx->result->code; return 1 if $code >= 200 && $code < 400; + if ( $code == 403 || $code == 404 || $code == 405 ) { + return $self->ua->get_p($url)->then( + sub { + my $get_tx = shift; + my $get_code = $get_tx->result->code; + return 1 if $get_code >= 200 && $get_code < 400; + return 1 + if $get_code == 403 + || $get_code == 404 + || $get_code == 405; + return Mojo::Promise->reject( + "URL returned $get_code error") + if $get_code >= 400; + return Mojo::Promise->reject( + "URL returned unexpected status: $get_code"); + } + ); + } return Mojo::Promise->reject("URL returned $code error") if $code >= 400; return Mojo::Promise->reject( @@ -295,11 +314,13 @@ sub validate_url_with_checks { unless $parsed->scheme && $parsed->scheme =~ /^https?$/i; return Mojo::Promise->reject('Invalid URL format') unless $parsed->host; + my $normalized = $parsed->to_string; + return Mojo::Promise->reject( "URL exceeds maximum length of $MAX_URL_LENGTH characters") - unless $self->is_valid_url_length($sanitized); + unless $self->is_valid_url_length($normalized); - return $self->is_blocked_url($sanitized)->then( + return $self->is_blocked_url($normalized)->then( sub { my $blocked = shift; return Mojo::Promise->reject( @@ -308,12 +329,12 @@ sub validate_url_with_checks { my $ssl_check = $parsed->scheme eq 'https' - ? $self->check_ssl_certificate($sanitized) + ? $self->check_ssl_certificate($normalized) : Mojo::Promise->resolve(1); return $ssl_check->then( - sub { return $self->check_url_reachable($sanitized); } ) - ->then( sub { return $sanitized; } ); + sub { return $self->check_url_reachable($normalized); } ) + ->then( sub { return $normalized; } ); } ); }