2012-08-28 1 views
1

기본 인증이 필요한 https 웹 사이트로 이동하려고하면 다음 프로그램이 실패합니다. Mojolicious UA에서 기본 인증 실패의 원인이되는 암호의 특수 문자

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#[email protected]) 
-- Connect (https:foobar:Cant:443) 
Connection error: Couldn't connect 

이 Mojolicious 3.35은 CPAN에서 업데이트 사용합니다. 불행히도 암호에는 "특수 문자"(ascii #! @ %^& 등)가 포함될 수 있으며 #을 포함하지 않는 암호로 변경하는 것은 옵션이 아닙니다. 웹 서버는 웹 브라우저에서 요청을 올바르게 처리하므로 웹 서버 구성 문제라고 생각하지 않습니다.

그래서 Mojo에서이 작업을 수행 할 수있는 또 다른 방법이 있습니까?

답변

4

오류는 사용자의 것이며 모조의 오류는 아닙니다. 특히 URL이 잘못 작성되었습니다. 수정 : 네, 수정이 uri_escaping

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

. 감사. – Todd

2
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;