Тайм-аут Perl Mechanize не работает с https

Я использовал библиотеку Perl Mechanize, но по какой-то причине с параметром тайм-аута https (я использую Crypt::SSLeay для SSL).

мой $browser = WWW::Mechanize->new(autocheck=>0, timeout=>3);

Кто-нибудь сталкивался с этим раньше и знает, как это исправить? Спасибо!


person Roger    schedule 06.03.2011    source источник
comment
Вы как-то запнулись в первом предложении. Что происходит с параметром тайм-аута?   -  person Sdaz MacSkibbons    schedule 06.03.2011
comment
Извините, я хотел сказать, что параметр тайм-аута не действует.   -  person    schedule 06.03.2011


Ответы (2)


Для HTPS/SSL необходимо найти обходной путь:

my $html = `wget -q -t 1 -T $timeout -O - $url`;
mech->get(0); 
$mech->update_html($html);
person Ωmega    schedule 04.07.2012

Просто тестируя его сейчас на https://www.sourceforge.net/, у меня сложилось впечатление, что Аргумент timeout действительно работает, но он не работает до тех пор, пока не произойдет согласование HTTPS. Я установил очень низкое значение тайм-аута, дробное значение, и он правильно сообщает о тайм-ауте, но задержка намного больше, чем мое значение тайм-аута, а затем он сразу же возвращается с ошибкой тайм-аута.

Пример:

#!/usr/bin/perl

use strict;
use warnings;
$|=1;

# This "works", downloading the page within the timeout period
use WWW::Mechanize;
my $mech = WWW::Mechanize->new(
    timeout => 3,
);
$mech->get( 'https://www.sourceforge.net/' );
print "Successful get.\n";

# This throws a connect timeout, but after a delay much longer than 50ms
my $mech2 = WWW::Mechanize->new(
    timeout => 0.05,
);
$mech2->get( 'https://www.sourceforge.net/' );
print "Successful get 2.\n";

Вывод:

Successful get.
Error GETing http://sourceforge.net/: Can't connect to sourceforge.net:80
(connect: timeout) at ./throwaway22855.pl line 20

Похоже, тайм-аут обрабатывается глубоко внизу в IO::Socket, используя select. В некоторых системах это может мешать работе SIGALRM, поэтому, если вы хотите обойти это и написать свой собственный тайм-аут, обязательно прочитайте документацию по реализации вашей платформы. Также обратите внимание (в perldoc perlipc), что Perl использует отложенные сигналы, начиная с 5.8.x, поэтому установка сигнала тревоги вручную может не работать без использования обходного пути sigprocmask.

Здесь есть дополнительная информация: Timeout SIGALRM -- Как влияет ли это на существующие операции?

person Sdaz MacSkibbons    schedule 06.03.2011