いま(このサイトじゃないけど)PHP-4.2.2とcurl-7.10.4を使っているが、以下のようにしてもIf-Modified-Sinceヘッダもつかないし、戻ってくるLast-Modifiedヘッダを処理してくれない。なぜか。よくわからん。$mtimeに数字を入れておけばHTTPのIf-Modified-Sinceが送られ、$modifにLast-Modifiedの文字列をパースした値が入るのではないのか!?
$tmpfile=tmpfile();
$c=curl_init();
curl_setopt($c, CURLOPT_URL, $url);
curl_setopt($c, CURLOPT_FILE, $tmpfile);
curl_setopt($c, CURLOPT_HEADER, 0);
if($mtime){
curl_setopt($c, CURLOPT_TIMECONDITION, TIMECOND_IFMODSINCE);
curl_setopt($c, CURLOPT_TIMEVALUE, $mtime);
}
$r=curl_exec($c);
$rcode=curl_getinfo($c, CURLINFO_HTTP_CODE);
$modif=curl_getinfo($c, CURLINFO_FILETIME);
$size=curl_getinfo($c, CURLINFO_SIZE_DOWNLOAD);
curl_close($c);
fclose($tmpfile);
Cで書くとうまくいくなぁ。
#include <stdio.h>
#include <curl.h>
int main(int argc, char **argv)
{
CURL *c=curl_easy_init();
curl_easy_setopt(c, CURLOPT_URL, "http://localhost:9999/");
curl_easy_setopt(c, CURLOPT_HEADER, 0);
curl_easy_setopt(c, CURLOPT_TIMECONDITION, TIMECOND_IFMODSINCE);
curl_easy_setopt(c, CURLOPT_TIMEVALUE, 1061276136);
curl_easy_perform(c);
curl_easy_cleanup(c);
return 0;
}
結果は以下の通り。ちゃんとIf-Modified-Sinceヘッダがついているのがわかる。
# socket -s 9999
GET / HTTP/1.1
Host: localhost:9999
Pragma: no-cache
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
If-Modified-Since: Tue, 19 Aug 2003 06:55:36 GMT
(追記) 2003-09-29 15:05 Pythonでもうまくいった。…PHPのソースを見たら、TIMECOND_IFMODSINCEが定義されていなかった。ヘッダを見ると値が1だったので、
curl_setopt($c, CURLOPT_TIMECONDITION, 1);
とすると正しく動作するようになった。…sigh