2

以下程序在尝试访问需要基本身份验证的 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 中还有其他方法可以实现这一点吗?

4

2 回答 2

4

错误是你的,不是 Mojo 的。具体来说,URL 构建不正确。使固定:

use URI::Escape qw( uri_escape );
my $creds = uri_escape($user) . ':' . uri_escape($pass);
my $url  = 'https://' . $creds . '@site.foo.com/';
于 2012-08-28T18:21:37.060 回答
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;
于 2012-08-28T21:43:34.007 回答