URI::Fetchで301→304となったときpatch
微妙な問題なのだが、URI::Fetchで。
301リダイレクト先で、304 Not Modifiedとなったときに正しくコンテンツを返さない
https://blog.nomadscafe.jp/index.xmlはfeedburnerに301リダイレクトされているのですが。
my $cache = Cache::FileCache->new();
my $fetch = URI::Fetch->fetch('https://blog.nomadscafe.jp/index.xml',Cache=>$cache);
print Dumper($fetch);
というスクリプトで、動かしたときに、2回目にコンテンツが正しく返りません。
301リダイレクトした先(feedburner)の方から304が返されてしまっているのでそうなります。
本来であれば、301が返ってきたとことでURI::Fetchを利用するアプリケーションの方でデータベースを書き換えるなどの処理が必要になると思うのですが、
PlaggerのAggregator::Simpleとかまだ、そういう仕組み(まだ)がないので、、Patchを書いてみた。
--- URI-Fetch-0.05.orig/lib/URI/Fetch.pm 2006-03-04 18:57:44.000000000 +0900
+++ URI-Fetch-0.05/lib/URI/Fetch.pm 2006-03-04 19:02:41.000000000 +0900
@@ -88,6 +88,13 @@
if ($res->previous && $res->previous->code == HTTP::Status::RC_MOVED_PERMANENTLY()) {
$fetch->status(URI_MOVED_PERMANENTLY);
$fetch->uri($res->previous->header('Location'));
+ if ($res->code == HTTP::Status::RC_NOT_MODIFIED()) {
+ $fetch->status(URI_NOT_MODIFIED);
+ $fetch->content($ref->{Content});
+ $fetch->etag($ref->{ETag});
+ $fetch->last_modified($ref->{LastModified});
+ return $fetch;
+ }
} elsif ($res->code == HTTP::Status::RC_GONE()) {
$fetch->status(URI_GONE);
$fetch->uri(undef);
正直微妙なところだと思います。