2012-06-25 14 views
5

He escrito una aplicación web Dancer que utiliza Net::OpenID::Consumer para consumir OpenID para la autenticación. Funciona bien con Google y MyOpenID, pero no con Yahoo. Cuando un usuario intenta autenticarse utilizando su cuenta de Yahoo, HTML::Parser advierte:¿Cómo puedo evitar errores de codificación usando Net :: OpenID :: Consumer con Yahoo OpenIDs?

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

y esta advertencia mata mi aplicación (razón).

No veo ningún error existente con Net::OpenID::Consumer (o común) relacionado con esto.
Los encabezados HTTP y las metaetiquetas HTML especifican UTF-8 para el URI "ID reclamado".
¿Por qué no se debe decodificar la respuesta para HTML::Parser? ¿Me estoy perdiendo algo obvio?

Aquí está el código correspondiente:

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

[Mostrar su código] (http://sscce.org) para que la gente [reproducir el problema] (http: // www.chiark.greenend.org.uk/~sgtatham/bugs.html#showmehow). – daxim

+1

Parece que no decodificó el HTML antes de pasarlo al analizador, así que descodifíquelo. Si esto era LWP, diría que use '-> decoded_content' en lugar de' -> content'. –

+1

user1215106, Net :: OpenId :: Common está capturando y analizando el HTML, no mi código. – kbosak

Respuesta

1

El error está en Net/OpenID/URIFetch.pm en las líneas 122-128 de la versión 1.14 (última) Se trata de utilizar el contenido en bruto en lugar del contenido decodificado del objeto respuesta. Simplemente elimine la decodificación gzip manual y use el método decoded_content en la respuesta.

No he enviado ningún informe de error todavía, no dude en contactarnos. :)

Aquí es un diff puede aplicar para solucionarlo:

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

¡Increíble, gracias! Presentaré un informe de error pronto y vincularé esta publicación. – kbosak

Cuestiones relacionadas