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



所以我已经研究了互联网的尽头(至少我是这么认为的)。我正在尝试为get()设置 60 秒的alarm超时,但它没有被捕获并且将超过 60 秒,而且每当 www::mechanized::timed 构造函数达到默认超时(180 秒)时,我收到以下错误:

在/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 "alarmn" };
alarm 60;
$ua->get('https://secure.site.com'); #secure site that timed out
alarm 0;
} catch {
die $_ unless $_ eq "alarmn";
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 超时不适用于 https 和 在 Perl 中执行超时的方法?

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

可以在 https 上的 WWW::Mechanize 中使用超时吗?

或修补 LWP::用户代理

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

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

谢谢!

下面的帮助为每个get()设置了一个闹钟,似乎比尝试捕捉要容易得多 sigalarm,除非我错过了什么?

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;
}

与这个问题几乎相同的答案,但使用实际代码 在 Perl 中进行超时的方法?

来自 http://metacpan.org/pod/Sys::SigAction 的文本

timeout_call()

$timeout ,$coderef

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

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

如果警报关闭,代码将被中断。警报是 如果在触发警报之前代码返回,则取消。例行公事 如果正在执行的代码超时,则返回 true。(被打断了)。 执行的代码引发的异常将传播出去。

在返回到 访客。

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

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

使用Sys::SigAction::timeout_call不安全?

最新更新