5

Net::OpenID::Consumer認証に OpenID を使用する Dancer Web アプリを作成しました。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

このバグは、Net/OpenID/URIFetch.pmのバージョン 1.14 (最新) の 122 ~ 128 行にあります。応答オブジェクトのデコードされたコンテンツではなく、生のコンテンツを使用しています。手動の 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 に答える