2012-06-25 38 views
5

我写了一个舞者的Web应用程序,它利用Net::OpenID::Consumer消耗进行身份验证的OpenID。它适用于Google和MyOpenID,但不适用于Yahoo。当用户试图使用他们的雅虎帐户进行身份验证,HTML::Parser警告:如何避免使用Net :: OpenID :: Consumer与Yahoo OpenID编码错误?

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

和此警告杀死我的应用程序(理应如此)。

我没有看到任何现有的错误与涉及到这个Net::OpenID::Consumer(或通用)。
HTTP头和HTML的meta标签都指定UTF-8的 '声明ID' URI。
为什么会反应不能被解码为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

像你这样的声音在将HTML传递给Parser之前没有对其进行解码,因此将其解码。如果这是LWP,我会说使用' - > decoded_content'而不是' - > content'。 –

+1

user1215106,Net :: OpenId :: Common是抓取和解析HTML,而不是我的代码。 – kbosak

回答

1

bug是网/ OpenID的/ URIFetch.pm上线的1.14版本(最新) 它使用原始内容,而不是响应对象的解码的内容122-128。 只需卸下手动gzip的解码,并在响应使用decoded_content方法。

我还没有提交bug报告呢,感觉很自由。 :)

这里是你可以申请修复它DIFF:

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