Search code examples
perlmojolicious

Special Characters in password causing Basic Auth Failure in Mojolicious UA


The following program fails when trying to go to an https web site that requires basic authentication.

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";
}

When I run with MOJO_USERAGENT_DEBUG=1 I get the following output:

-- Blocking request (https://foobar:cant#change@site.foo.com)
-- Connect (https:foobar:Cant:443)
Connection error: Couldn't connect

Using Mojolicious 3.35 updated from CPAN. Unfortunately, passwords will likely contain "special characters" (ascii #!@%^& and the like) and changing the password to something not containing a # is not an option. The web server handles the request correctly in web browsers, so I do not believe it is a web server configuration issue.

So is there another way to achieve this in Mojo?


Solution

  • The error is yours, not Mojo's. Specifically, the URL is incorrectly built. Fix:

    use URI::Escape qw( uri_escape );
    my $creds = uri_escape($user) . ':' . uri_escape($pass);
    my $url  = 'https://' . $creds . '@site.foo.com/';