2

次のプログラムは、基本認証を必要とする https Web サイトにアクセスしようとすると失敗します。

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 に答える