![](/img/trans.png)
[英]Better way to proxy an HTTP request using Perl HTTP::Response and LWP?
[英]Is it possible to abort a HTTP request depending on the `Content-Type` when using Perl's LWP?
正如其他人所指出的,您可以在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文档的“处理程序”部分。
我没有抓住异常抛出或确保在这里仔细处理406响应。 我把它作为读者的练习。
您可以使用HEAD请求来查询URI的标头信息。 如果服务器响应头部,你将获得GET将返回的所有内容,除了那个讨厌的主体。
然后,您可以根据MIME类型决定要执行的操作。
否则,在您提出申请之前,您必须依赖文件的扩展名。
如果您使用的是最小的LWP::Simple
的子类LWP
,则head
函数返回的内容类型为列表的第一个元素。
所以你可以写
use strict;
use warnings;
use LWP::Simple;
for my $url ('http://www.bbc.co.uk') {
my ($ctype) = head $url;
my $content = get $url if $ctype eq 'text/html';
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.