加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

使用Perl的LWP时,是否可以根据`Content-Type`中止HTTP请求?

发布时间:2020-12-16 06:18:44 所属栏目:大数据 来源:网络整理
导读:我希望我的脚本只下载文本/ html内容,而不是二进制文件或可能需要更多时间下载的图像.我知道 max_size参数,但我想在Content-Type标头上添加一个检查.这可行吗? 解决方法 正如其他人所指出的,您可以在GET请求之前执行HEAD请求.你应该这样做是为了对服务器礼
我希望我的脚本只下载文本/ html内容,而不是二进制文件或可能需要更多时间下载的图像.我知道 max_size参数,但我想在Content-Type标头上添加一个检查.这可行吗?

解决方法

正如其他人所指出的,您可以在GET请求之前执行HEAD请求.你应该这样做是为了对服务器礼貌,因为它实际上很容易中止连接,但Web服务器不一定容易中止发送大量数据并在其结束时做一堆工作.

根据您想要的复杂程度,有一些不同的方法可以做到这一点.

>您可以使用您的请求发送一个Accept标头,该标头仅列出text / html.如果您说您不接受文件的任何内容,那么良好实施的HTTP服务器将返回406 Not Acceptable状态.当然,无论如何,他们可能会发送给你.您也可以将此作为HEAD请求执行此操作.
>使用最新版本的LWP::UserAgent时,可以使用处理程序子例程在标题之后和内容正文之前中止请求的其余部分.

use LWP::UserAgent;
use Try::Tiny; 

my $ua = LWP::UserAgent->new;
$ua->add_handler( response_header => sub {
    my($response,$ua,$h) = @_;

    die "Not HTML" unless $response->content_type eq 'text/html';
});

my $url = "http://example.com/foo";

my $html;
my $head_response = $ua->head($url,Accept => "text/html");
if ($head_response->is_success) {
    my $get_response = $ua->get($url,Accept => "text/html");
    if ($get_response->is_success) {
        $html = $get_response->content;
    }
}

有关处理程序的详细信息,请参阅LWP :: UserAgent文档的Handlers部分.

我没有抓住异常抛出或确保在这里仔细处理406响应.我把它作为读者的练习.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读