2012-06-25 2 views
5

Ich habe eine Dancer Web App geschrieben, die Net::OpenID::Consumer nutzt, um OpenIDs zur Authentifizierung zu verwenden. Es funktioniert gut mit Google und MyOpenID, aber nicht mit Yahoo. Wenn ein Benutzer versucht, mit ihrem Yahoo-Konto zu authentifizieren, HTML::Parser warnt:Wie kann ich Codierungsfehler mit Net :: OpenID :: Consumer mit Yahoo OpenIDs vermeiden?

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

und diese Warnung tötet meine app (zu Recht).

Ich sehe keine vorhandenen Fehler mit Net::OpenID::Consumer (oder Common), die sich darauf beziehen.
Die HTTP-Header und die HTML-Meta-Tags geben beide UTF-8 für den URI 'beanspruchte ID' an.
Warum wurde die Antwort nicht für HTML::Parser decodiert? Fehle ich etwas Offensichtliches?

Hier ist der entsprechende Code:

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

[Zeigen Sie Ihren Code] (http://sscce.org), so dass die Menschen können [Reproduzieren des Problems] (http: // www.chiark.greenend.org.uk/~sgtatham/bugs.html#showmeshow). – daxim

+1

Klingt so, als ob Sie das HTML nicht entschlüsselt haben, bevor Sie es an Parser übergeben haben, also entschlüsseln Sie es. Wenn das LWP wäre, würde ich sagen '' -> decoded_content' anstelle von '-> content'. –

+1

user1215106, Net :: OpenId :: Common ist das Ergreifen und Parsing des HTML, nicht meines Codes. – kbosak

Antwort

1

Der Fehler ist in Net/OpenID/URIFetch.pm auf den Leitungen 122-128 von Version 1.14 (neuesten) Es ist mit dem Rohinhalt anstatt den entschlüsselten Inhalt des Antwortobjekts. Entfernen Sie einfach die manuelle gzip-Decodierung und verwenden Sie die decoded_content-Methode in der Antwort.

Ich habe noch keinen Fehlerbericht eingereicht, fühle mich frei. :)

Hier ist ein diff Sie anwenden können, um es zu beheben:

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

Super, danke! Ich werde bald einen Fehlerbericht einreichen und diesen Beitrag verlinken. – kbosak

Verwandte Themen