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);
正直微妙なところだと思います。