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;
}
};
[Pokaż kod] (http://sscce.org) tak, że ludzie mogą [odtworzyć problem] (http: // www.chiark.greenend.org.uk/~sgtatham/bugs.html#showmehow). – daxim
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'. –
user1215106, Net :: OpenId :: Common pobiera i parsuje kod HTML, a nie mój. – kbosak