WWW :: Mechanize :: Timed https超时不起作用

时间:2012-10-18 22:07:26

标签: perl https timeout try-catch www-mechanize

所以我研究了这个问题的互联网(至少我是这么认为)。我正在尝试为alarm设置get()超时60秒,但它不会被捕获并且将超过60秒,也是在达到默认超时(180秒)的任何​​时间www :: mechanized :: timed构造函数,我得到以下错误:

在/usr/lib/perl5/site_perl/5.10.0/WWW/Mechanize/Timed.pm第52行另外使用未初始化的值(+)。

代码:

use WWW::Mechanize::Timed;
use HTTP::Cookies;
use Try::Tiny;

my $ua = WWW::Mechanize::Timed->new(
autocheck => 0#turning off autocheck becuase any get errors will be fatal need to check ourselves
);

my $cookies = HTTP::Cookies->new(
autosave => 1
);

$ua->cookie_jar($cookies);

$ua->agent_alias("Windows IE 6");

try{
local $SIG{ALRM} = sub { die "alarm\n" };
alarm 60;
$ua->get('https://secure.site.com'); #secure site that timed out
alarm 0;
} catch {
die $_ unless $_ eq "alarm\n";
print "page timed out after 60 seconds!\n";
exit;
};

my $total_time = sprintf '%.3f', ($ua->client_elapsed_time);

unless($ua->success){
print "Error: " . $ua->status;
exit;
}
...

我已经解决了这些问题,想出如何在不编写自己的超时功能的情况下使警报工作。

Perl Mechanize timeout not working with httpsWays to do timeouts in Perl?

到目前为止,我看到了使用LWPx :: ParanoidAgent的建议,不确定我是否理解“使用LWPx :: ParanoidAgent并将其混合到Mech”部分

Possible to use timeout in WWW::Mechanize on https?

或用

修补LWP :: UserAgent

http://search.cpan.org/~sharyanto/LWP-UserAgent-Patch-HTTPSHardTimeout-0.04/lib/LWP/UserAgent/Patch/HTTPSHardTimeout.pm

关于如何让超时与警报一起工作的任何想法?

谢谢!

1 个答案:

答案 0 :(得分:1)

下面有助于为每个get()设置一个警报,看起来比使用sig alarm尝试捕获要容易得多,除非我遗漏了什么?

use Sys::SigAction qw(timeout_call);

if ( timeout_call( 60 ,sub { $ua->get('https://secured.site.com'); } ))
   {
print "ALARM page timed out after 60 seconds!\n" ;
exit;
}

与此问题几乎相同的答案,但使用实际代码Ways to do timeouts in Perl?

来自http://metacpan.org/pod/Sys::SigAction

文字

  

timeout_call()

     

$timeout ,$coderef

     

给出代码引用和超时值(in   秒),timeout()将(在eval中)设置一个信号处理程序   SIGALRM(将死),设置闹钟,并执行代码   参考。 $ time(秒)可以表示为浮点   号。

     

如果Time :: HiRes存在且可用,则可以使用timeout_call()   计时器分辨率为0.000001秒。如果时间:HiRes不可用   然后将小于1.0的派系第二个值进行转换   到1。

     

如果闹钟响起,代码将被中断。警报是   如果代码在触发警报之前返回,则取消。例程   如果正在执行的代码超时,则返回true。 (被打断了)。   执行代码抛出的异常会传播出来。

     

恢复原始信号处理程序,然后返回   呼叫者。

     

如果HiRes不可加载,Sys :: SigAction将做正确的事情   转换

要考虑/记住的最后一件事:

use of Sys::SigAction::timeout_call unsafe?