HTTPサーバのCGI機能を極める [ColdFire V2]
付録基板のHTTPサーバには、CGIの機能が装備されているので、調べてみました。 コレを使えば、XXXをXXXすることだって、できるよね。
HTML文書に長い文字列を埋めてみた
このHTTPサーバのCGI機能は、html文書からSilentCの関数を呼び出して、その出力を埋め込むという仕掛けです。 表を作成する関数を呼び出したところ、途中で打ち切られて最後まで出してくれません。 原因を調べるために、簡単な出力を出す関数を用意しました。
s(){PrStr("----+----1----+----2----+----3"); PrStr("----+----4----+----5----+----6"); PrStr("----+----7----+----8----+----9"); PrStr("----+----0");}
100バイトの目盛り付き文字出力を行います。 この関数を"Page1"というファイルに入れて使います。 HTML文書は、こんなものです。
<html><body><pre> $EXEC'Page1::s' </pre></body></html>
"Page1.htm"というファイルに入れて、HTTPサーバに表示させたところ、こんな出力が出てきました。
<html><body><pre> ----+----1----+ </pre></body></html>
わずかに15文字で打ち切られてしまいました。 表を作るなんて、とんでもないという長さです。
呼び出し方を変えたら
表作成関数を呼び出した時に打ち切られたのは、もっと長い文字数でした。 関数の呼び出し方に問題があるのかもしれないと考えて、括弧を加えてみました。
<html><body><pre> $EXEC'Page1::s()' </pre></body></html>
<html><body><pre> ----+----1----+-- </pre></body></html>
すると、こんどは、17文字になりました。
つまり、これは、$EXEC'Page1::s()'
という文字列の長さと同じです。
このHTTPサーバのCGI機能とは、元のファイルの該当箇所を「置き換える」機能だったようです。
呼び出し方をムダに長くする
だったら、関数呼び出し側の文字数をもっとムダに長くすれば、解決ですね。
<html><body><pre> $EXEC'Page1::s( 0, 0, 0)' </pre></body></html>
本当は、括弧の中に空白を並べるだけで十分なのですが、記事にすると見えなくなるので、引数として表現しています。 このHTML文書を使うと、こんな出力が得られました。
<html><body><pre> ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8- 0)' </pre></body></html>
埋め込む場所は、十分に用意したはずなのに、81文字で打ち切られてしまいました。 内部処理で準備されたバッファの長さの限界ということでしょうか。 おまけに、コンソールにゴミが出力されて、時には暴走してしまいます。 何か、壊しちゃったみたいですね。
本日の考察
- HTTPサーバのCGI機能は、元の文書の該当箇所を置き換える機能である。
- CGI機能で長い文字列を出したいときには、元の文書で場所を確保しておかなくてはならない。
- 置き換えられる文字数は、81文字が限界で、これ以上長くすると暴走の危険がある。ただし、81文字であれば絶対に安全かという検証はしていない。
どうやら、この置き換えの作業をしているのが、"ReplaceCgi"という関数のようです。 このCGI機能で表を作成するのは、難しそうだな。
参考文献
Interface (インターフェース) 2008年 09月号 [雑誌]
- 作者:
- 出版社/メーカー: CQ出版
- 発売日: 2008/07/25
- メディア: 雑誌
どっちかと言えばSSIですよね。
もう自分でhttpサーバー機能を実現してしまった方が、好きな事が出来て良い様な。
by hamayan (2008-09-29 09:01)
Server Side Includes (SSI) と言うのですね。
httpサーバを実現するということになると、SilentCでは出来ないですよね。今、考えている企画は、SilentCで作るところに意義があるので。
付録基板からは、エッセンスだけを提供して、表を作成する部分にはJavaScriptを使うと何とかなりそうだ。でも、これって、付録基板でやる意味があるのか?JavaScriptだけで、済んじゃう話になるかも。
by noritan (2008-09-29 12:25)
あらゆる機能を実現しなくとも、反復サーバーでGETとかせいぜいPUTのリクエストに答える程度なら、SilentCでも出来そうな気はします。
リクエストurlがhtmならファイルを引っ張ってくるだけだし、cgiならプログラムを起動すれば良い。
CMOSカメラとか接続しておいて、jpgならそのカメラのデータを送るだけとか。
そもそもSilentCのhttpサーバーは平行サーバーなのですかね?。
by hamayan (2008-09-29 12:34)
少なくとも、SilentCで作成する場合には、「maxsocに1を指定しろ」といっているぐらいだから、並行サーバはムリだと思います。
実験としてGIFを二種類埋め込んだHTML文書をFirefoxから要求したところ、ちゃんと表示できていました。パケット・モニタで観測すると、HTML-GIF-GIF-HTMLという順序で受信していて、HTML文書を取り直したようです。もしかしたら、要求が衝突したのかも知れません。
HTML文書内かhttpヘッダに「お手柔らかに」オプションを付けることって、できないんでしょうか。
by noritan (2008-09-29 13:08)
そうですね、まずSilentCのhttpサーバーがリクエストの返信としてhttpヘッダーにHTTP 1.1と答えていますが、本当にHTTP 1.1をサポートしているのだろうか?。
HTTP 1.0なら、一度セッションを完了してから再びセッションを開始するので、反復サーバーでも可能だと思うけれど。
by hamayan (2008-09-29 13:41)