神の声で、=やら&やら<>が入力できないと、バグだししてもらっちゃったので、さくさく対処。
まぁ原因は簡単なことで、クライアント側からサーバー側にデータを送信する際、application/x-www-form-urlencodedと呼ばれるいわゆるFormのPOST形式で送っていたんですが、、、
こいつのフォーマットが、&FROM=なんちゃら&MESSAGE=なんちゃらという単純な文字列でして。サーバー側では&と=で切り出してたもんですから、なんちゃらの部分に&や=を混ぜちゃうと、おかしなところで、ちょんぎっちゃうんですね。
んで、どーしたもんかなぁ。
適当にエンコードしようかなぁ、なんて考えながら、Google教授と相談していたところ、、、
煩悩分画 拾弐にてやっぱりXMLデータをPOSTしたいよねなる記述を発見。
考えてみれば、XMLでデータもらってくるんだから、XMLでデータをPOSTしたほうがかっこいいかなと。
XMLだったらCDATAの中にエンコードして詰め込んじゃえばなんでもはいっちゃうわけだし。
ということで、この方針でさくさく改造を進める。
まず、クライアント側。
function sendData内のContent-typeをtext/xmlに変更して、
function postFormとfunction reloadMessage内で、ぽちぽちXML形式の文字列を生成。
function postForm内ではついでに、encodeURIでエンコードしておく。
次にサーバー側。
PerlでもXML::DOMくらいあるやろ。と思ってGoogle教授に尋ねると、File Glob の Perl for Win32内、PerlとXMLという文章のXML::DOMについてという記述を発見。まさにこれ。
chat.cgiで
use XML::DOM;
としておいて、それっぽく、改修。DOMを叩いて、木を探って文字列を抽出。デコードしてから、<と>を&ltと&gtに変換するように変更。
木を探るところは、クライアントとほぼ同じ記述にしておいた。
なんとなく、XMLを文字列で作って、送って、XMLから文字列を作って、ファイルに落とすときに、また、文字列からXMLを生成したりして、頭、悪い。なんかまどろっこしいぞ。
でも、デコードして、<>を変換しておきたいので、このあたりはどーしたもんかと。
なんとなく、XML::DOMを使うようになって、心持、遅くなったような気が。。。
まぁ動いてるからええか。
ということで、こちらで試せます。ソースコードは、こちら。
追記10/01/2005 サーバ移転に伴いリンク先が動かなくなりました。現在の最新版はこちらで試せます。
これだと、上りもXML。下りもXML。
って考えてみたら、この構造、SOAPを叩いてるのにそっくりでして。。
クライアントが直接SOAP叩いて、XMLで結果もらって、DHTMLで表示してって、なんとなく、わけわからんけど、頭のいいクライアントが書けそうな、そんな匂いが漂ってきた。
てな匂いをかいでたら、JSON-RPCなるキーワードを発見。
もっとちゃんと調べなければ。
chatごときでも、すんげぇ勉強になる。
日々、修行です。