2014年12月2日火曜日

wgetの更新確認処理がとても期待外れな件

wget。
公開データとかを定期的にダウンロードしたりするスクリプトなんかだと、かなり活躍していると思います。

ずっとこれまで、httpの場合、-Nオプションを付ければ IF-MODIFIED-SINCEヘッダをつけてくれているものと勝手に思い込んでいた。

いつも-qオプションつけて運用しているので情けないことに最近気づいたんだけど、最近自分専用のホームページを改装するにあたってwgetを利用するため、-qを付けないでテストししたりするうちに、304なんか見たことがないことに気が付いた。

更新されていないはずなのに必ず200が返ってくる。
それでいて、「サーバより新しいのでダウンロードしませんでした」とか言い出す。

200はそーゆー意味じゃねえだろ?
更新されてなければ304じゃないと意味が通らねえだろ。

と思って、wgetと相手のサーバとの電文を見てみると、ファイル取得要求ぶちかまして200もらってレスポンスヘッダのLast-Modifiedヘッダとファイルのタイムスタンプを比較しているだけだった・・・

つまり、ダウンロードを中断しているだけだった。

うへぇ

ヘッダを追加することはできるので、自分でやれってことかあ。

shじゃ大変だけど、perlとかで書いてる場合は、もしかして自分でhttpしゃべったほうが(If-Last-Modified実装に関しては)早いんじゃないのか、と。

なんだ、結局書かなくちゃいけないのか。

とおもったところ、curl ではそれが可能だということを知りました。

curl の-zオプションではまさにIf-Modified-Sinceをリクエストに入れてくれる、とドキュメントにはあります。

早速実行してみると・・・

> GET *****.html HTTP/1.1
> User-Agent: curl/7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
> Host: www.********.jp
> Accept: */*
> If-Modified-Since: Mon, 01 Dec 2014 19:57:10 GMT
>
< HTTP/1.1 304 Not Modified
< Accept-Ranges: bytes
< Cache-Control: max-age=300
< Date: Mon, 01 Dec 2014 23:03:23 GMT
< Last-Modified: Mon, 01 Dec 2014 19:57:10 GMT
< Server: *************
< X-Cache: HIT

素晴らしい!

やっぱり気にしている人はいたんですね。
いやあ、またソケットたたいて昔ながらのhttpしゃべらなくて済みます。
というより、外部コマンドを呼び出すコストをかけられないような環境でばかり開発していたもので、こういうリッチに外部コマンドを呼び出して豪快にデータをそろえていくなんていうことはあまりないため、つい全部書いちゃう癖がついていたのですが、このご時世にそれもないよね、とおもって調べてみてヨカッタ。

知る人にとっては常識だったのでしょうが、実にありがたい思いです。
今後、ぜひ活用していきたいと思います。

0 件のコメント:

コメントを投稿