2011-03-06 33 views
0

我一直在使用Perl的機械化庫,但由於某種原因HTTPS超時參數(我使用Crypt :: SSLeay的SSL)。Perl機械化超時不適用於https

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

有沒有人遇到過這種情況,並知道如何解決它?謝謝!

+1

你有種落後了那裏的第一句話。超時參數會發生什麼? – 2011-03-06 10:24:57

+0

對不起,我打算說超時參數沒有效果。 – 2011-03-06 11:51:10

回答

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 

似乎超時在IO ::插座下方深處處理,使用select。在某些系統上,這可能會干擾SIGALRM,所以如果您想要解決此問題並編寫自己的超時時間,請確保您閱讀了平臺的實施文檔。還請注意(在perldoc perlipc中)自從5.8.x以來Perl已經使用了延遲信號,因此如果不使用sigprocmask解決方法,手動設置鬧鐘可能無法正常工作。

有一些更多的信息在這裏: SIGALRM Timeout -- How does it affect existing operations?

1

對於HTPS/SSL你必須做一些變通方法:

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