Perl Mechanize超时无法使用https

时间:2011-03-06 10:19:20

标签: perl https timeout mechanize

我一直在使用Perl的Mechanize库,但出于某种原因使用https的timeout参数(我正在使用Crypt :: SSLeay for SSL)。

  

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

之前是否有人遇到此问题并知道如何修复它?谢谢!

2 个答案:

答案 0 :(得分:1)

对于HTPS / SSL,您必须采取一些解决方法:

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

答案 1 :(得分:0)

现在只针对https://www.sourceforge.net/进行测试,我得到了超时参数 工作的印象,但直到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

使用select似乎在IO :: Socket中深入处理超时。在某些系统上,这可能会干扰SIGALRM,因此如果您想解决此问题并编写自己的超时,请务必阅读平台的实施文档。另请注意(在perldoc perlipc中)Perl自5.8.x以来一直使用延迟信号,因此如果不使用sigprocmask解决方法,手动设置闹钟可能无效。

这里有更多信息: SIGALRM Timeout -- How does it affect existing operations?