[英]Perl Mechanize timeout not working with https
我一直在使用Perl的Mechanize庫,但是出於某種原因使用了https超時參數(我在對SSL使用Crypt :: SSLeay)。
我的$ browser = WWW :: Mechanize-> new(autocheck => 0,timeout => 3);
有人遇到過這個問題,並且知道如何解決嗎? 謝謝!
對於HTPS / SSL,您必須執行一些解決方法:
my $html = `wget -q -t 1 -T $timeout -O - $url`;
mech->get(0);
$mech->update_html($html);
現在,僅在針對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
解決方法,則手動設置警報可能無法正常工作。
這里有更多信息: SIGALRM超時-它如何影響現有操作?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.