プロトコルの概要
コマンドライン引数の記述が無いESTPプロトコル。
コマンドライン引数の送信が必要な場合は、ESTP/0.2を使う。
動作の概要
- ESTPサーバは、tcpまたはunix domain socketを使い、クライアントの接続を待ち受ける。
- そこへ、ESTPクライアントが、サーバへとsocket接続を行う。
- ESTPサーバは、複数のESTPクライアントからの接続を同時に処理できる機能を持つ事が望ましい。
- 接続したら、まずESTPクライアントは、サーバに対して"ESTP/0.1\r\n"という文字列を送信する事(greeting)。サーバはそれを読み取り、もし自身がESTP/0.1に対応していないのであれば、即座に接続を切断してよい。
- その後、ESTPクライアントは、自身の環境変数を一つのS式として送信する事。
- このS式は、基本的には、Gaucheのwww.cgiモジュールが提供するcgi-metavariables形式のalistとする。
- 但し、環境変数そのものは文字列のエンコーディングに関する情報を含まない(どころか、単なるバイナリデータかも知れない)為、7bit asciiの範囲外のバイト値は、Gaucheの"\xNN"形式のエスケープ書式で表現され、全体が不完全文字列(#*"..."リテラルによって表現される)で送るものとする。
- この部分は、将来のESTPバージョンでは、もっと汎用的な表現方法に変更されるかも知れない(が、ESTP/0.1ではこのフォーマットを採用する)。
- この為、サーバ側は、このS式をcgi-metavariablesとして利用する前に、事前にstring-incomplete->completeをかけたり、(必要なら)エンコーディング変換を行ったりしなくてはならない。
- 尚、ESTPクライアントは、環境変数をS式として送った後、余分なデータ(空白や改行等も不可)は全く送ってはならない。
- 先のS式の送受信が完了した後、クライアントとサーバは以下の動作を行う。
- ESTPクライアントは、クライアント自身のstdinから流し込まれるデータを無加工のままsocketに送信し、socketから読み取れるデータを無加工のまま自身のstdoutに出力する。
- ESTPサーバは、クライアントとのsocketから読み取れるデータ(つまり、クライアントのstdin)を利用して何らかの処理を行い、その結果を(必要であれば)socketに出力する(つまり、これがクライアントのstdout出力になる)。
- 尚、ESTPクライアント/サーバ共に、SIGPIPEは無視する設定にしておくのが望ましいと思われる。
- クライアント/サーバは、以下の状況の時に通信を終了して良い。
- ESTPクライアントは、stdinまたはsocketがEOFになったら、その転送先にもEOFを送り、その後、転送先からもEOFが読み出せるまで待ち、それからクライアントプロセス自身を終了する事が望ましい。
- しかし、もし必要であれば、任意の時点で、いきなり終了してもよい(例えば、シグナルによって途中終了する時など)。
- 尚、ESTPクライアント側が任意の時点で終了/通信の切断が可能である事に注意し、ESTPサーバは、任意の時点での通信の切断にも適切に対応できなくてはならない。
- これは、ESTPサーバの実装の話だけではなく、ESTPサーバ上で動作するアプリケーションのトランザクションの安全性等も含んでいる事に注意。
- ESTPサーバは、自身の処理が完了した時は、socketのshutdownによって、サーバ側の処理が完了した事をクライアントへと伝える。
備考
- 概要のところにも書いたが、基本的にはESTPクライアントは任意の時点で終了し得る為、ESTPサーバ(及びその上で動作するアプリ)は任意の時点で通信が途切れても、トランザクション安全に動作できるようなコードである必要がある。
最終更新 : 2007/02/04 06:05:47 JST