« Kansai.pm 6th Meeting | メイン | SonyのVGP-BMS30を買った »

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);


正直微妙なところだと思います。