2012-06-25 37 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