我编写了一个Perl脚本,它会检查URL列表并通过发送GET请求连接到它们。
现在,假设其中一个网址的文件非常大,例如尺寸大于> 100 MB。
发送请求时使用以下命令下载此文件:
$mech=WWW::Mechanize->new();
$url="http://somewebsitename.com/very_big_file.txt"
$mech->get($url)
发送GET请求后,它将开始下载文件。我希望使用WWW :: Mechanize取消它。我怎么能这样做?
我在这里检查了这个Perl模块的文档:
http://metacpan.org/pod/WWW::Mechanize
然而,我找不到可以帮助我做到这一点的方法。
感谢。
答案 0 :(得分:6)
GET
请求使用:content_cb
选项,您可以为get()
提供回调函数,该函数将针对从服务器接收的每个响应内容块执行。您可以使用:read_size_hint
选项设置 * 块大小(以字节为单位)。这些选项记录在LWP::UserAgent中(WWW中的get()
:: Mechanize只是LWP :: UserAgent中相同方法的重载版本。)
在读取1024字节的响应内容后,将中止以下请求:
use WWW::Mechanize;
sub callback {
my ($data, $response, $protocol) = @_;
die "Too much data";
}
my $mech = WWW::Mechanize->new;
my $url = 'http://www.example.com';
$mech->get($url, ':content_cb' => \&callback, ':read_size_hint' => 1024);
print $mech->response()->header('X-Died');
Too much data at ./mechanize line 12.
请注意,回调中的die
不会导致程序本身死亡;它只是在响应对象中设置X-Died
标头。您可以向回调中添加适当的逻辑,以确定应在何种条件下中止请求。
根据您的评论,听起来像真正想要的是,如果内容太大,就不会首先发送请求。这与中途中止GET
请求完全不同,因为您可以使用Content-Length
请求获取HEAD
标头,并根据值执行不同的操作:
my @urls = qw(http://www.example.com http://www.google.com);
foreach my $url (@urls) {
$mech->head($url);
if ($mech->success) {
my $length = $mech->response()->header('Content-Length') // 0;
next if $length > 1024;
$mech->get($url);
}
}
请注意,根据HTTP spec,应用应设置Content-Length
标头。这并不意味着他们将(因此我的代码示例中的默认值为0
)。
*根据文档,“协议模块将尝试以这种大小的块来从服务器读取数据”,但我不认为这是保证。