Специальные символы в пароле, вызывающие сбой базовой аутентификации в Mojolicious UA

Следующая программа дает сбой при попытке перейти на веб-сайт https, для которого требуется обычная проверка подлинности.

use Mojo::UserAgent;
my $ua = Mojo::UserAgen->new;

my $user = "foobar";
my $pass = "Cant#change";

my $url  = "https://$user:$pass\@site.foo.com";
my $tx   = $ua->get($url);

if (my $res = $tx->success) {
    say $res->body;
}
else {
    my ($message, $code) = $tx->error;
    say $code ? "$code response $message" : "Connection error: $message";
}

Когда я запускаю с MOJO_USERAGENT_DEBUG=1, я получаю следующий вывод:

-- Blocking request (https://foobar:cant#[email protected])
-- Connect (https:foobar:Cant:443)
Connection error: Couldn't connect

Использование Mojolicious 3.35, обновленного с CPAN. К сожалению, пароли, скорее всего, будут содержать «специальные символы» (ascii #!@%^& и т.п.), и изменение пароля на нечто, не содержащее символ #, невозможно. Веб-сервер правильно обрабатывает запрос в веб-браузерах, поэтому я не думаю, что это проблема конфигурации веб-сервера.

Так есть ли другой способ добиться этого в Mojo?


person Todd    schedule 28.08.2012    source источник


Ответы (1)


Ошибка твоя, а не Моджо. В частности, URL-адрес построен неправильно. Исправить:

use URI::Escape qw( uri_escape );
my $creds = uri_escape($user) . ':' . uri_escape($pass);
my $url  = 'https://' . $creds . '@site.foo.com/';
person ikegami    schedule 28.08.2012
comment
Да, uri_escaping исправляет это. Спасибо. - person Todd; 28.08.2012