2012-06-25 27 views
5

Tôi đã viết một ứng dụng web Dancer sử dụng Net::OpenID::Consumer để sử dụng OpenID để xác thực. Nó hoạt động tốt với Google và MyOpenID, nhưng không hoạt động với Yahoo. Khi người dùng cố gắng xác thực bằng tài khoản Yahoo của họ, HTML::Parser cảnh báo:Làm cách nào để tránh lỗi mã hóa khi sử dụng Net :: OpenID :: Consumer with Yahoo OpenID?

Parsing of undecoded UTF-8 will give garbage when decoding entities

và cảnh báo này giết ứng dụng của tôi (đúng là như vậy).

Tôi không thấy bất kỳ lỗi hiện có nào với Net::OpenID::Consumer (hoặc Chung) liên quan đến điều này.
Các tiêu đề HTTP và thẻ meta HTML đều chỉ định UTF-8 cho URI 'xác nhận quyền sở hữu'.
Tại sao phản hồi không được giải mã cho HTML::Parser? Tôi có thiếu một cái gì đó hiển nhiên?

Dưới đây là các mã có liên quan:

get '/openid_landing' => sub { 
    my $params = params(); 
    my $csr = Net::OpenID::Consumer->new(
     ua => LWP::UserAgent->new(), 
     consumer_secret => $secret, 
     params => $params, 
    ); 
    my $id = $params->{'openid.claimed_id'}; 

    if (my $setup_url = $csr->user_setup_url) { 
     redirect $setup_url; 

    } elsif ($csr->user_cancel) { 
     redirect uri_for('/'); 

    } elsif (my $vident = $csr->verified_identity) { 
     # verified identity, log in or register user 
     ... 

    } else { 
     die "Error validating identity: " . $csr->err; 
    } 
}; 
+0

[Hiển thị mã của bạn] (http://sscce.org) để mọi người có thể [tạo lại vấn đề] (http: // www.chiark.greenend.org.uk/~sgtatham/bugs.html#showmehow). – daxim

+1

Có vẻ như bạn không giải mã HTML trước khi chuyển nó sang Parser, vì vậy hãy giải mã nó. Nếu đây là LWP, tôi muốn sử dụng '-> decoded_content' thay vì' -> content'. –

+1

user1215106, Net :: OpenId :: Common là lấy và phân tích cú pháp HTML, không phải mã của tôi. – kbosak

Trả lời

1

Lỗi là ở Net/OpenID/URIFetch.pm trên dòng 122-128 của phiên bản 1.14 (mới nhất) Đó là sử dụng các nội dung thô thay vì nội dung được giải mã của đối tượng phản ứng. Chỉ cần xóa giải mã gzip thủ công và sử dụng phương thức decoded_content trong phản hồi.

Tôi chưa gửi báo cáo lỗi, cảm thấy tự do. :)

Dưới đây là một diff bạn có thể áp dụng để sửa chữa nó:

122c122 
<   my $content = $res->decoded_content; 
--- 
>   my $content = $res->content; 
125a126,129 
>   if ($res->content_encoding && $res->content_encoding eq 'gzip') { 
>    $content = Compress::Zlib::memGunzip($content); 
>   } 
> 
+0

Tuyệt vời, cảm ơn! Tôi sẽ gửi báo cáo lỗi về vấn đề này sớm và sẽ liên kết bài đăng này. – kbosak

0

Nó xuất phát từ các module HTML :: Parser được sử dụng bởi TreeBuilder dưới mui xe, trước khi bạn đi qua các nội dung trang để TreeBuilder, cho chúng ăn qua decode_utf8:

use HTML::TreeBuilder; 
use Encode; 
my $contents = ...; 
my $htree = HTML::TreeBuilder->new_from_content(decode_utf8 $contents); 

Để biết thêm:

http://metacpan.org/pod/HTML::TreeBuilder#new-from-content

http://search.cpan.org/dist/HTML-Parser/Parser.pm

Các vấn đề liên quan