いま(このサイトじゃないけど)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