2009-08-16 16 views
20

私はPerlのLWP::UserAgentを使ってウェブ上のいくつかのページを取得しており、可能な限り丁寧になりたいと考えています。デフォルトでは、LWP::UserAgentはgzipで圧縮されたコンテンツをシームレスに処理しません。誰もが帯域幅を節約するために、そうするための簡単な方法はありますか?LWP :: UserAgentを使用してgzip圧縮コンテンツを受け入れる方法はありますか?

答えて

34

LWPには、HTTP::Messageのおかげで、この機能が組み込まれています。しかし、それは少し隠されています。

gzipを処理できるように、最初にCompress::Zlibがインストールされていることを確認してください。 HTTP::Message::decodable()は、インストールしたモジュールに基づいて許可されたエンコードのリストを出力します。この出力は、スカラーコンテキストでは、Accept-Encoding 'HTTPヘッダーで使用できるカンマ区切り文字列の形式をとります。LWPには、自分でHTTP::Request -sを追加する必要があります。 (Compress::Zlibがインストールされて私のシステムでは、リストは「gzipx-gzipdeflate」である。)あなたのHTTP::Responseが戻って来るとき

は、 $response->decoded_content代わりの $response->contentでコンテンツにアクセスしてください。 LWP::UserAgent

、それはすべて、このように一緒に来る:

my $ua = LWP::UserAgent->new; 
my $can_accept = HTTP::Message::decodable; 
my $response = $ua->get('http://stackoverflow.com/feeds', 
    'Accept-Encoding' => $can_accept, 
); 
print $response->decoded_content; 

これはまた、PerlのUnicode文字列にテキストをデコードします。あなたはだけテキストと応答ではなく、混乱を解凍するLWPをしたい場合は、そのように実行します。

print $response->decoded_content(charset => 'none'); 
+0

注:これは(7月8日から)LWP 5.814で動作します以降。 –

+3

LWP 6.03のテストでは、 'content'ではなく' decoded_content'を使うだけでした。 – Cas