簡體   English   中英

Perl Mechanize超時不適用於https

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM