Página 1 de 1

Problemas con LWP y Transfer-Encoding: chunked

NotaPublicado: 2012-03-09 11:13 @509
por h3ct0r
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; 

Re: Problemas con LWP y Transfer-Encoding: chunked

NotaPublicado: 2012-03-09 15:15 @677
por explorer
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.

Re: Problemas con LWP y Transfer-Encoding: chunked

NotaPublicado: 2012-03-10 20:52 @911
por h3ct0r
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!

Re: Problemas con LWP y Transfer-Encoding: chunked

NotaPublicado: 2012-03-12 12:44 @572
por explorer
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.

Re: Problemas con LWP y Transfer-Encoding: chunked

NotaPublicado: 2012-03-20 12:33 @565
por h3ct0r
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í !!