PHP/curl

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です