簡體   English   中英

使用Perl的LWP時,是否可以根據`Content-Type`中止HTTP請求?

[英]Is it possible to abort a HTTP request depending on the `Content-Type` when using Perl's LWP?

我希望我的腳本只下載文本/ html內容,而不是二進制文件或可能需要更多時間下載的圖像。 我知道max_size參數,但我想在Content-Type標頭上添加一個檢查。 這可行嗎?

正如其他人所指出的,您可以在GET請求之前執行HEAD請求。 你應該這樣做是為了對服務器禮貌,因為它實際上很容易中止連接,但Web服務器不一定容易中止發送大量數據並在其結束時做一堆工作。

根據您想要的復雜程度,有一些不同的方法可以做到這一點。

  1. 您可以使用您的請求發送一個Accept標頭,該標頭僅列出text/html 如果您說您不接受文件的任何內容,那么良好實施的HTTP服務器將返回406 Not Acceptable狀態。 當然,無論如何,他們可能會發送給你。 您也可以將此作為HEAD請求執行此操作。

  2. 使用最新版本的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM