cgi-lib.plの修正
ezWEBからのフォーム送信(マルチパートではない)では、$ENV{'CONTENT_TYPE'} 値の中に
Content-Typeが付いてきてしまうので、正しく解析ができません。そのため、
x-www-form-urlencoded 通信を認識する場合は、次のようにしないとエラーが発生します。
$type eq 'application/x-www-form-urlencoded') {
↓
$type =~ m#^application/x-www-form-urlencoded#) {
フォームデコード時に…
一般的に _ (アンダーバー)は半角英数字に含まれます。
J-SKYでは、フォームで渡される NAME=VALUE で、NAMEに _ を使う場合、
NAMEの部分もURLデコードしないと認識されません。
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
($name,$value) = split(/=/,$pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
↓
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
($name,$value) = split(/=/,$pair);
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
ezWEBはキャッシュが利く
ezWEB(無論機種によるかもしれないが)はキャッシュ操作がちゃんとしているようで、
キャッシュを無効にする記述を入れると、同じページにアクセスしたときに再読込してくれる。
逆に入れないと、キャッシュを表示するようだ。
<META http-equiv="Expires" content="0"> ←ただしこの行だけはJ-SKYの一部の機種(※)で「不正な情報を受信しました」になるので避ける
<META http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
※表示不能になったのはSH52でのアクセス。その他は不明。
ezWEBはクッキーが使える
ezWEBのクッキーは RFC 2109 仕様のようだ。すなわち、Netscapeの仕様とはちと異なる。
「空白や記号を含む場合は値をダブルクォーテーションで囲む」
「新しい属性が用意されている」
「Cookieリクエストヘッダで、$を先頭に付けて属性値を送信する」
「Expires ではなく max-age を使用し、秒数を指定する」
(参考文献)
J-SKYはQUERYと標準入力の同時入力ができない?
実験の結果では、クエリー(GET)と標準入力(POST)が同時に送信された場合、標準入力の値しか取得が出来ないようです。
<form method=post action="test.cgi?QUERY">
<input name=NAME value=VALUE>
以上の状況を把握した上でXHTMLで作成すると…
XHTMLで作成したページをiMODE/ezWEB(WAP1.0)/ezWEB(WAP2.0)/J-SKYでの実験の確認の結果、
いずれも動作できました。もちろん細かい点は機種によると思いますが…。
以前と比べて、現実的にはHTML/CHTML/HDMLというように分ける必要がなくなり、
1つ書けば3キャリアどれでも表示してくれるようです。ただし、
絵文字は共通とは限らない(iMODEの絵文字を指定するとezWEBはかなり近似なものを表示してくれる)ので極力避ける。
また、タグはXHTMLで使えてもiMODEで使えないものは避けるなど、下位コンパチ風にすると成功する確率が高くなる。
余談
iMODE、au(WAP1.0機)、au(WAP2.0機)、Vodafone …と動作確認のために揃えると、
費用がかかるなぁ…(汗)。H"(カード端末の使用の方が多いだろう)やASTELは少数派として、
今回は用意しませんでしたが、そのうち予算があればやってみたいと思っています。
H"はiMODEエミュレーションで動くそうなので、大丈夫なのかな?
ちなみに、SO505iS J-D08 A1304T C1001SA で確認した実験結果です。
|