密码中的特殊字符导致Mojolicious UA中的基本身份验证失败

时间:2012-08-28 18:14:18

标签: perl mojolicious

尝试访问需要基本身份验证的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#change@site.foo.com)
-- Connect (https:foobar:Cant:443)
Connection error: Couldn't connect

使用从CPAN更新的Mojolicious 3.35。不幸的是,密码可能包含“特殊字符”(ascii#!@%^&等),并且将密码更改为不包含#的内容不是一种选择。 Web服务器在Web浏览器中正确处理请求,因此我认为这不是Web服务器配置问题。

那么在Mojo中有另一种方法可以实现吗?

2 个答案:

答案 0 :(得分:4)

错误是你的,而不是Mojo的错误。具体来说,URL构建不正确。修正:

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

答案 1 :(得分:3)

use Mojo::Base -strict;
use Mojo::URL;

#1 Mojo way
my $url = Mojo::URL->new('http://google.com/')->userinfo('user:pa#ss');
say $url;


#2 or manually
use Mojo::Util qw/url_escape/;

my $auth = join ':', url_escape('user'), url_escape('pa#ss');

my $url2 = qq{http://$auth\@google.com/};
say $url2;