URI::Fetch is a smart client for fetching syndication feeds (RSS, Atom, and others) in an intelligent, bandwidth- and time-saving way.
LWP でリモートのコンテンツを取得するにあたって Last-Modified や ETag を抽象化した well-written clients のためのモジュール。Cache::Cache でローカルキャッシュを保持して Last-Modified と Etag に対応、また、Compress::Zlib がインストールされていれば自動で圧縮ダウンロードを実行するサーバーに優しいクライアント。作者は Movable Type の Ben Trott 氏。
RSS や Atom などのフィードを取得する際にサーバや帯域に余計な負荷をかけないためには、クライアント側でキャッシュしてやって Last-Modified ヘッダを正しく解釈するとよい、というか今後のフィードクライアントはそのように振舞うべきというのが世の中のコンセサンスです。
LWP の mirror ですら使うのめんどくさいな、ってなときも URI::Fetch でさらに短いコードで書けます。(このモジュールの目玉としては GZIP サポートを抽象化しているところだとも思いますが)
ちなみに、CPAN の perldoc には現在 typo があります。fetch の第二引数はハッシュリファレンスではなく、ハッシュですね。
#!/usr/local/bin/perl
use strict;
use warnings;
use Cache::File;
use URI::Fetch;
my $cache = Cache::File->new( cache_root => '/memfs/tmp' );
my $res = URI::Fetch->fetch('http://naoya.dyndns.org/~naoya/mt/index.rdf',
Cache => $cache ) or die URI::Fetch->errstr;
print $res->content;
こんな感じで。サーバのアクセスログを見ると、
202.222.30.98 - - [03/Jan/2005:11:01:35 +0900] "GET /~naoya/mt/index.rdf HTTP/1. 1" 200 31616 "-" "URI::Fetch/0.01" 202.222.30.98 - - [03/Jan/2005:11:01:36 +0900] "GET /~naoya/mt/index.rdf HTTP/1. 1" 304 - "-" "URI::Fetch/0.01"
UserAgent が URI::Fetch なアクセスには、2回目以降きっちり 304 が返ってます。