2012-06-25 17 views
5

Napisałem aplikację internetową Dancer, która wykorzystuje Net::OpenID::Consumer do używania identyfikatorów OpenID do uwierzytelniania. Działa dobrze z Google i MyOpenID, ale nie z Yahoo. Gdy użytkownik próbuje uwierzytelnić używając swojego konta Yahoo, HTML::Parser ostrzega:Jak mogę uniknąć błędów kodowania używając Net :: OpenID :: Consumer z Yahoo OpenIDs?

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

i to ostrzeżenie zabija moją aplikację (słusznie).

Nie widzę żadnych istniejących błędów z Net::OpenID::Consumer (lub wspólne), które odnoszą się do tego.
Nagłówki HTTP i metatagi HTML określają kod UTF-8 dla identyfikatora URI "claim id".
Dlaczego odpowiedź nie została zdekodowana dla HTML::Parser? Czy brakuje mi czegoś oczywistego?

Oto odpowiedni kod:

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

[Pokaż kod] (http://sscce.org) tak, że ludzie mogą [odtworzyć problem] (http: // www.chiark.greenend.org.uk/~sgtatham/bugs.html#showmehow). – daxim

+1

Wygląda na to, że nie dekodowałeś kodu HTML przed przekazaniem go do analizatora składni, więc go odszyfkuj. Gdyby to było LWP, powiedziałbym, użyj '-> decoded_content' zamiast' -> content'. –

+1

user1215106, Net :: OpenId :: Common pobiera i parsuje kod HTML, a nie mój. – kbosak

Odpowiedz

1

Błąd jest w netto/OpenID/URIFetch.pm na liniach 122-128 wersji 1.14 (najnowsza) To wykorzystaniem surowej zawartości zamiast zdekodowany zawartości obiektu odpowiedzi. Wystarczy usunąć ręczne dekodowanie gzip i użyć metody decoded_content w odpowiedzi.

Nie mam jeszcze zgłoszenia błędu, nie krępuj się. :)

Oto diff można zastosować go naprawić:

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

Awesome, thanks! Wkrótce zgłoszę błąd i połączę ten post. – kbosak