2012-06-25 3 views
5

Net::OpenID::Consumerを使用して認証用のOpenIDを使用するDancer Webアプリケーションを作成しました。 GoogleとMyOpenIDではうまく動作しますが、Yahooではうまく動作しません。Yahoo OpenIDでNet :: OpenID :: Consumerを使用してエンコードエラーを回避するにはどうすればよいですか?

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

をし、この警告は(当然のように)私のアプリを殺す:ユーザーがYahooのアカウントを使用して認証しようとすると、HTML::Parserは警告しています。

これに関連するNet::OpenID::Consumer(または共通)のバグはありません。
HTTPヘッダーとHTMLメタタグの両方で、「要求ID」URIにUTF-8が指定されています。
なぜ応答はHTML::Parserのためにデコードされませんか?私は明白な何かを欠いていますかそれはあなたがTreeBuilderにページの内容を渡す前に、decode_utf8を介してそれらを養う、ボンネットの下にTreeBuilderで使用されている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; 
    } 
}; 
+0

[コードを表示](http://sscce.org)人々が(HTTP [問題の再現]できるように://をwww.chiark.greenend.org.uk/~sgtatham/bugs.html#showmehow)。 – daxim

+1

あなたはParserに渡す前にHTMLをデコードしていないのであれば、デコードしてください。これがLWPなら、 ' - > content'の代わりに' - > decoded_content'を使うといいでしょう。 –

+1

user1215106、Net :: OpenId :: Commonは、自分のコードではなく、HTMLを取得して解析しています。 – kbosak

答えて

1

バグはバージョン1.14(最新) のライン122-128にネット/ 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); 
>   } 
> 
+0

恐ろしく、ありがとう!私はこれについてすぐにバグレポートを提出し、この記事をリンクします。 – kbosak

関連する問題