![](/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.