Perl:HTTP::Tiny Connection暂停,get()永远不会返回



我在fedora35上使用perl-HTTP-Tiny-0.080,并试图检查URL的状态以确定返回代码。我的脚本运行得很好,直到它在sophos.com上找到这个带有PDF的特定URL。脚本只是暂停,用new((调用get((或head((永远不会返回。我还试着设置了一个超时,但它似乎被忽略了。

use HTTP::Tiny;  
use Net::FTP::Tiny qw(ftp_get);
my $url = "https://news.sophos.com/wp-content/uploads/2020/02/CloudSnooper_report.pdf";
my $response = HTTP::Tiny->new(timeout => 2)->get($url);
print "status: $response->{status} $urln";

印刷品永远无法到达。手动使用wget成功,同时尝试将代理设置为除";HTTP/Tinny";失败。

my $response = HTTP::Tiny->new(agent => "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36")->get($url);

这段代码是一个更大的脚本的一部分,我正在使用这个脚本来检查缓冲区中的一系列URL,以确定它们是404并且应该被删除,还是仍然是工作链接。

我不确定我能提供什么进一步的信息。

news.sophos.com的URL重定向到www.sophos.com上的其他URL。后一个服务器受Akamai CDN保护:

$ dig www.sophos.com
...
www.sophos.com.         169     IN      CNAME   www.sophos.com.edgekey.net.
www.sophos.com.edgekey.net. 469 IN      CNAME   e6203.b.akamaiedge.net.
e6203.b.akamaiedge.net. 300     IN      A       23.60.192.131

如果请求不是由浏览器发送的典型请求,Akamai的机器人程序保护可能会显示出一些奇怪的行为。这可能会失败,状态代码为403,但也只是根据您的经验挂起,即重新定位客户端。另请参阅请求SSL连接超时或特定网站SSL证书的奇怪CURL问题。另请参阅为什么Akamai边缘服务有时不发送任何响应,导致连接超时,这顺便描述了您在www.sophop.com中遇到的类似问题。

在这种特定的情况下,只需在请求中添加一个Accept头就可以了:

my $response = HTTP::Tiny->new(default_headers => { Accept => '*/*' })->get($url);

请注意,当Akamai调整其机器人检测时,此解决方案可能在未来不再有效。

我还试图设置一个超时,但它似乎被忽略了。

这是一个已知的问题,当使用TLS 1.3时尤其明显,这里就是这样。请参阅有时,超时可能无法激发#146。

最新更新