http_request()で rc が 300 番台のときの処理をどうするべきか†
- ページ: BugTrack
- 投稿者: mizkaz
- 優先順位: 低
- 状態: 完了
- カテゴリー: 本体バグ
- 投稿日: 2003-09-30 (火) 22:43:04
- バージョン: 1.4
メッセージ†
http_request() の振る舞いについてご相談です。
http_request() を使うように自作のプラグインを改造し、テストをしていたら、コンテンツが取得できないことがありました。条件は以下の通りです。
- http_request() を用いてコンテンツを get しようとした
- プロキシは未使用の設定 $use_proxy=0
- http://php.net/ にアクセス
この条件でアクセスすると、http_request() は301番のレスポンスを返します。301 番なので location ヘッダを取得してリダイレクトすればコンテンツが取れます。
これは、http_request() という関数名からは正しい振る舞いと言えますが、私が欲しかったのはHTTPでGETしたコンテンツでした。以前のソースでは URL を fopen して fgets すればコンテンツが取れていました。
この場合、
- http_request() を利用するプログラムの方で、301番が返ってきたときは、locationヘッダを見て、再度リクエストを投げる
べきなんでしょうか、それとも
- http_request() の内部で、300番台のレスポンスの場合はlocationヘッダを見てリダイレクトする
ようにした方がいいんでしょうか。
p.s. 試していないんですが、$use_proxy=1 の場合は、この現象っておきないんですか?
- たぶん、プロキシがリダイレクト先を取ってきてくれるようになっているのではないかと。
- locationヘッダを処理するのは、ブラウザの責任なので、言い換えれば、利用する側の責任とも考えることは可能だと思います。そこで、この部分を実装したのは、私がかつて書いた proxy.inc です。この機能が実装されないと、サーフィンにはなりません。かと言って、METAタグでのジャンプもあるので、このあたりを考えると色々とありますよね。どうしますか? -- upk
- fopen_wrappersでは301/302に限定しているようです。proxy.phpもそれに倣う形でいいんじゃないでしょうか。 METAタグは…呼び出し元で何とかしてもらいましょう。レスポンス200を得た時点でhttp_request()の役目は終わっていると思います。 :) -- ぱんだ
- 仰るように、利用する側の責任で対処するというのもひとつの方法です。ただ、URLをfopenしてfgetsしすれば 300番台のレスポンスは気にする必要がなく、ちゃんとコンテンツを取得できるので、それに対応するような関数が欲しいところです。http_request() をラップして、300番のときは自動的にリダイレクトしてくれるようなものが。 -- mizkaz
- レスポンスコードが301か302のときはLocation:を見て、その先を取りに行くようにしてみました。 cvs:proxy.php(v1.4:r1.4)を試してみてください。 -- ぱんだ
- PHPのソースコード'http_fopen_wrapper.c'を参考にしています。ループ回避のための再入回数制限はデフォルトで10回です。Locationが相対URIであってもそれなりに処理するようにしてありますが、問題があるかもしれません。 -- ぱんだ