PCサイト->携帯変換 0.9.7リリースとドコモ端末情報ファイルの更新
FCRになったらいいなという希望はあっさり打ち砕かれ、不具合が見つかったので、その部分だけを修正したアップデートを脊髄反射でリリースして、このエントリーを投稿しようと思った矢先にNTTドコモさまが端末情報を更新されやがりましたので、端末情報ファイル(DevInfo_DoCoMo.inc.php)も“別途に”リリースです。
ご不便をおかけしてすいませんが、それぞれ更新してやってください。なお、0.9.7のほうは、0.9.6からはメインスクリプト(pc2m.php)のみ入れ替えていただければ結構です。それ以前からのバージョンアップの手順などはリリースメモ/変更履歴をご覧ください。
ちなみに今回の不具合は。
HTML中では、CGI類のURIのパラメータ区切り文字として伝統的に使用される「&」は、(他の「&」と同様に)「&」のように実体参照で記述しなければならないのはご承知の通りですが、このスクリプトは、このようなURIについて「&」を「&」に戻さず、そのままでリクエストしてました(サーバ側で「&」を区切り文字として認識してくれない限り、そのリクエストは当然無効)。
さて、ところでこれは、本来はPEARのHTTP_RequestやNet_URLあたりが実装しておいてくれると嬉しい類だと思うのですが、いかがでしょう。
Net_URLは、区切り文字をphp.iniのarg_separator.outputで指定されている文字列に置き換えます。arg_separator.outputを「&」にしていると、Net_URLに渡したURIは、パラメータの区切り文字が「&」に変換されるわけです。なお、残念ながら、その逆方向の処理はありません。さて、そうなるとNet_URLにURIを引き渡しているHTTP_Requestは、当然「&」(を含む任意の文字列)を区切り文字として受け取ることを想定しているわけですが、では「&」を「&」に戻しているかというと、そういう処理ではなく、こちらはNet_URLにURIを引き渡す際に、arg_separator.outputを一時的に「&」にしています。
function _buildRequest() {
$separator = ini_get('arg_separator.output');
ini_set('arg_separator.output', '&');
$querystring = ($querystring = $this->_url->getQueryString())? '?'.$querystring: '';
ini_set('arg_separator.output', $separator);
てなことでこちらは、元の区切り文字が、arg_separator.inputのほうで指定されているものであれば、なんでも兎に角「&」に置き換えるという仕様になってます。
ということは、このスクリプトが設置されているサーバのarg_separator.inputが「;&」とかなっていて、もしも、区切り文字として「;」を採用しているURIがあったとすると、「;」はすべて「&」に置き換えられちゃうわけですが、さらにもしも、そのURIのリクエスト先が、「レガシーな「&」なんて知らねえよ、区切り文字は「;」しか受け付けません」というサーバだったりすると、リクエストが通らなかったりするわけですが。いや、そんなURIやサーバはないか(ないと思うのだけど、Another HTML-lintの実体参照の解説に、「これにからんで、パラメタ区切りは "&" じゃなくて ";" にしましょうとも書かれていますが」と書かれていたりするので、こういう誤解はなきにしもあらずな気がしないでもないような。ここで言及されているw3cの原文は、「We recommend that HTTP server implementors, and in particular, CGI implementors support the use of ";" in place of "&" to save authors the trouble of escaping "&" characters in this manner.」で、つまり、「&」と同時に「;」もサポートしておきましょう、であって、「&」を廃して「;」のみにしましょう、ではない筈。「&」と「;」の両方を区切り文字としてみなすようにしておけば、まさに今回のこのスクリプトの不具合のように、「&」をそのままでリクエストしてしまうお間抜けなクライアントが存在していてもなんとかなるじゃないかな、という趣旨ですね)。
☆☆☆
ところで、アクセスログを見てたら、なんでこんな検索語でこのサイトに辿り着いてるんだろうと思われるかたが多数いらっしゃったのですが、某エントリーで、あるまじきタイプミスをやらかしてことに今気付きますた。未知のデバイスの情報を求めてこのサイトにいらしたかたは、誠に申し訳ございませんが、単なるタイプミスですよ、というのを、こんなところでこっそり自白。
2006/02/27
トラックバック
このエントリーのトラックバックURL:
http://www.rcdtokyo.com/mt/mt-rcdtokyo5428-tb.cgi/714