• Publicidad

Problemas con LWP y Transfer-Encoding: chunked

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Problemas con LWP y Transfer-Encoding: chunked

Notapor h3ct0r » 2012-03-09 11:13 @509

Hola compañeros, estoy teniendo una duda a la hora de usar LWP. Actualmente tengo un script que necesita consultar datos de una página web, y parsear esa respuesta en XML. Generalmente la respuesta es grande, más o menos unas 2000 líneas.

El servidor al cual le hago las peticiones usa Transfer-Encoding: chunked, y muchas veces el content del request, viene con caracteres extraños colocados "al azar" como una string "\r\n1ff8\r\n" o "\r\n994\r\n". Creo yo que esto es debido a algún problema en la librería en pegar los datos que envía el servidor y coloca alguna información de más que no debería. También muchas veces el texto se queda por la mitad y no se puede ver el contenido completo del request.

Por extraño que parezca, ahora estoy usando Curl, (la librería WWW::Curl::Easy) para ser exactos, y hasta ahora me funciona perfecto y sin problemas. (También funciona bien si lo veo desde un navegador, Firefox y Chromium funcionan bien.)

¿Qué podría haber estado pasando con LWP? El enfoque con Curl da resultados, pero quería hacer el script multi thread para que fuera más rápido la búsqueda de información y con Curl según he leído, no soporta dos request al mismo tiempo.

¡Muchas gracias!

Si sirve de algo estoy usando Debian 6 Stable en amd64.
Y mi versión de Perl v5.10.1 (*) built for x86_64-linux-gnu-thread-multi

Un extracto de mi código con LWP es el siguiente :
Sintáxis: [ Descargar ] [ Ocultar ]
  1. my $agent = new LWP::UserAgent; 
  2. my $cookie_jar = HTTP::Cookies->new('file' => 'cookies.txt', autosave => 1, ignore_discard => 1 ); 
  3. $agent->cookie_jar($cookie_jar); 
  4. my $URL = "https://XXXXXX.net/client/iq2.php?22222"; 
  5. my $req = HTTP::Request->new(GET => $URL); 
  6. my $res = $agent->request($req); 
  7. my $content = $res->content; 
  8. print $content; 
h3ct0r
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-03-09 10:52 @494

Publicidad

Re: Problemas con LWP y Transfer-Encoding: chunked

Notapor explorer » 2012-03-09 15:15 @677

Bienvenido a los foros de Perl en Español, h3ct0r.

¿El servidor siempre responde con chunked? Es que ese puede ser el problema.

Lo normal, es que al hacer el GET, LWP indique en la cabecera HTTP que no quiere la información en formato comprimido.

Con curl no hay problemas porque sí es capaz de entender la transmisión de información comprimida.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problemas con LWP y Transfer-Encoding: chunked

Notapor h3ct0r » 2012-03-10 20:52 @911

Gracias por la bienvenida Explorer, ya había revisado el foro antes cuando necesitaba alguna respuesta, ¡esta es la primera vez que me atrevo a escribir un post!

Al parecer siempre responde chunked, edité la cabecera de HTTP del request con tamper Data cuando uso Firefox para colocar el campo vacío (Que según el RFC http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html dice que cuando la directiva se envía con un campo vació debería responder con el encoding más básico y comprensible por todos) y aun así responde con encoding chunk.

¿Será que no puedo usar LWP en este escenario? ¡Me gustaría saber qué otras opciones conocen para hacer request en HTTPS usando Encoding chunk, en paralelo con threads en Perl! ¡je,je! Algo complicada la frase, ¡no?

Y gracias por la atención, ¡saludos!
h3ct0r
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-03-09 10:52 @494

Re: Problemas con LWP y Transfer-Encoding: chunked

Notapor explorer » 2012-03-12 12:44 @572

He revisado las fuentes, y sí que hay soporte para ese tipo de transmisión. En Net::HTTP sí que hay transmisión con codificación chuncked, deflated y gzip. Estas dos últimas son las versiones comprimidas. Pero el autor avisa de que el sistema chuncked no funcionará si en la cabecera HTTP también aparece un Content-Length.

Lo que describes en el primer mensaje de este hilo es propio de este tipo de transmisión: en la primera línea está la longitud (en hexadecimal), y en la línea siguiente está la información, con esa longitud. En la página de Wikipedia hay un ejemplo más claro.

En lwpcook hay un ejemplo usando HTTP::Request.

El caso es que no veo una solución clara... y es extraño... el propio LWP, o mejor HTTP::Response deberían ser capaces de decodificarlo. En el código que pones antes, estás sacando el content() tal cual te lo devuelve la petición. Quizás haya que pasarlo por algún módulo que no conozco.

Aquí he encontrado un ejemplo de código que sirve para sacar la información de ese tipo de transferencia, pero sigo pensando que esto debería ser trabajo de HTTP::Request o de HTTP::Response o HTTP::Message.

Es decir, en lugar de content(), llamar a decoded_content(), como se indica en la sinopsis de HTTP::Response.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problemas con LWP y Transfer-Encoding: chunked

Notapor h3ct0r » 2012-03-20 12:33 @565

Explorer, disculpa la demora en responder, ¡mi máquina con Linux se fundió por un pico de voltaje!.

Sinceramente creo que puede haber algún bug con mi librería, ya que desde Windows usando Strawberry Perl con el mismo script ¡no daba problemas!

Usando decoded_content() al parecer no seguía mostrando caracteres extraños pero muy pocas veces funcionaba el script, ya que el mensaje se quedaba "picado" por la mitad.

Actualmente logré hacerlo funcionar en Linux forzando LWP a trabajar con HTTP 1.0 de esta manera:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $req = HTTP::Request->new(GET => $URL);
  2. $req->protocol('HTTP/1.0');
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Muchas gracias por la atención. ¡¡ Si logro descubrir cuál era el problema lo mandaré aquí !!
h3ct0r
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-03-09 10:52 @494


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados