5

我编写了一个 Dancer 网络应用程序,Net::OpenID::Consumer用于使用 OpenID 进行身份验证。它适用于 Google 和 MyOpenID,但不适用于 Yahoo。当用户尝试使用他们的 Yahoo 帐户进行身份验证时,会HTML::Parser发出警告:

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

这个警告会杀死我的应用程序(理所当然)。

我没有看到任何与Net::OpenID::Consumer此相关的现有错误(或常见错误)。
HTTP 标头和 HTML 元标记都为 'claimed id' URI 指定 UTF-8。
为什么不解码响应HTML::Parser?我错过了一些明显的东西吗?

以下是相关代码:

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;
    } 
};
4

2 回答 2

1

该错误位于 1.14 版(最新)第 122-128 行的Net/OpenID/URIFetch.pm中,它使用原始内容而不是响应对象的解码内容。只需删除手动 gzip 解码并在响应中使用 decoded_content 方法即可。

我还没有提交错误报告,请随意。:)

这是您可以应用来修复它的差异:

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);
>         }
>
于 2012-07-03T18:46:03.273 回答
0

它来自 TreeBuilder 在后台使用的 HTML::Parser 模块,在将页面内容传递给 TreeBuilder 之前,通过 decode_utf8 提供它们:

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

更多:

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

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

于 2012-07-03T02:30:49.710 回答