尝试访问需要基本身份验证的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中有另一种方法可以实现吗?
答案 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;