2012-06-12 9 views
7

Estoy usando LWP para descargar contenido de páginas web, y me gustaría limitar la cantidad de tiempo que espera para una página. Esto se logra en lwp así:maneja lwp timeout efectivamente

my $ua = LWP::UserAgent->new; 
$ua->timeout(10); 
$ua->get($url); 

Y esto funciona bien, excepto por el tiempo de espera cada vez que llega a su límite, sólo se muere y no puede continuar con el guión! Realmente me gustaría manejar este tiempo de espera correctamente para poder registrar que la URL tuvo un tiempo de espera y luego pasar a la siguiente. ¿Alguien sabe como hacer esto? ¡Gracias!

Respuesta

13

LWP::Agent 's get() devuelve un objeto HTTP::Response que se puede utilizar para los errores de comprobación:

use LWP::Agent; 
use HTTP::Status(); 

my $ua = LWP::UserAgent->new; 
$ua->timeout(10); 
my $response = $ua->get($url); 

if ($response->is_error) { 
    printf "[%d] %s\n", $response->code, $response->message; 

    # record the timeout 
    if ($response->code == HTTP::Status::HTTP_REQUEST_TIMEOUT) { 
     ... 
    } 
} 

Por cierto, la mejor práctica hoy en día es usar Try::Tiny en lugar de eval {...}. Te da try {...} catch {...}. y resuelve algunos problemas al marcar if [email protected] (ver la sección de antecedentes en la documentación Try::Tiny).

+0

¡Muchas gracias! Esto es realmente útil. Sin embargo, lo probé y, por alguna razón, incluso cuando hay un tiempo de espera, no entra dentro de esa segunda declaración if. "tiempo de espera de lectura" es lo que está dentro del mensaje $ respuesta->. ¿Sabes por qué no está probando como verdadero para el segundo enunciado if? – srchulo

+0

No estoy seguro. ¿'Usaste HTTP :: Status'? ¿Cuáles son los valores reales de '$ response-> message' y' $ response-> code'? ¿Es un tiempo de espera real (código 408)? – stevenl

+0

Utilicé el código exactamente como está arriba de "HTTP :: Estado :: HTTP_REQUEST_TIMEOUT". $ response-> message contiene "read timeout" y $ response-> code contiene "500". – srchulo

1

Para la mayoría de los propósitos, LWP :: tiempo de espera de agente de usuario es suficiente, pero lo hace sufrir algunos inconvenientes ... se aplica a cada llamada sistema, en lugar de a la suma de todas ellas. Si realmente necesita un período de tiempo de espera fijo, esta es una de las cosas que LWPx::ParanoidAgent se cuida.