CGIスクリプト

CGI スクリプト

[1] CGI を介してとやり取りするスクリプトCGIスクリプトと言います。ここでいう「スクリプト」は単独で実行されるプログラムあるいは “スクリプト”でなくても、ライブラリーの類であったり、静的に組み込まれた関数のようなものですらあっても構いません。

[4] 俗に、CGIスクリプトを指して単に「CGI」と呼ぶこともあります。

[5] CGI の仕様書内では単にスクリプト (script) と呼ばれています。

仕様書

定義

[3]

スクリプト (script)
界面に従ってから呼び出されるソフトウェア。 単独のプログラムである必要はなく、動的に読み込まれる (共有) ライブラリーでも構いませんし、 もっと言えば手続きであっても構いません。「スクリプト」 という用語はよく実行時に解釈されるの集合体と理解されたりしますが、 それは要件ではなく、本仕様の文脈にあってはより広い定義を持っています。
>>2

処理

実行

[8] 別途規定がない限り、CGIスクリプトを含んだファイル実行可能プログラムとして呼び出されます >>7

[9] CGIスクリプトからメタ変数および要求メッセージ・データを受け取ります。 はこの要求メッセージ・データを直ちにCGIスクリプトから利用可能とする必要はなく、 その準備ができていない段階であっても (クライアントから到着していない段階であっても) CGIスクリプトを起動して構いません。 >>7

[10] CGIスクリプトに対して標準出力などの方法で結果を引き渡します。

実行の中断

[11] 誤りが発生したらいつでも警告無くCGIスクリプトの実行を中断 (interrupt) 終了 (terminate) できます。例えばクライアントの通信路で失敗があったときに実行を中断して構いません。 従ってCGIスクリプトは非正常な終了を処理できるように準備するべきです>>7

[12] タイムアウトによりスクリプトを中断させても構いません。

[20] 例えば、CGIスクリプトプッシュなどの目的で無限に長い応答を返すことがあります。 HTTPクライアントHTTP接続を閉じることでHTTPサーバーからの応答の送信は終了することになりますが、 そのままではCGIスクリプトHTTPサーバー応答を送り続けますから、 HTTPサーバーはこれを停止させなければなりません。

現在作業ディレクトリー

[14] AmigaDOS ではスクリプト現在作業ディレクトリーはそのスクリプトがあるディレクトリーに設定されます。 UnixPOSIX 環境ではそのスクリプトがあるディレクトリーに設定されるべきです>>13

[15] AmigaDOS についてはなぜか要件ではなく事実として RFC で説明されています。

[19] IISCGIスクリプトの実行時に現在作業ディレクトリーを変更しておらず、 世間では不具合であると認識されていましたが、その後修正されたかどうかは未確認です。

文字集合

[16] AmigaDOS ではメタ変数頭欄US-ASCII を使います。 NLLF です。CRLFNL として受け付けるべきです>>13

[17] Unix ではメタ変数頭欄CHARNUL を除く US-ASCII を使います。 TEXT には ISO-8859-1 を使います。 PATH_TRANSLATED には NUL 以外の任意の8ビット・バイトを使います。 NLLF です。CRLFNL として受け付けるべきです>>13

[21] Unix では (C では) NULL文字列の終端を表します。 HTTPサーバー要求に含まれる NULL を適切に処理しないと、 CGIスクリプトを誤動作させることができるかもしれず、注意が必要です。

[18] EBCDIC を使う POSIX ではメタ変数頭欄CHARTEXTPATH_TRANSLATEDNUL を除く IBM1047 を使います。 NLLF です。CRLFNL として受け付けるべきです>>13

言語

[22] CGI で取り扱う構造を扱えるプログラミング言語であれば、どんな言語でもCGIスクリプトを記述できます。

[23] CGIスクリプトによく用いられた言語

[24] 初期も初期の解説だと Perl だけでなく C とかシェルスクリプトとか複数の言語に言及してなんなら複数の例文が載ってたりもするのが普通だったよな、そういえば。

[25] CGI = Perl なんておかしなこと言い出す人が出てきたり 「CGI/Perl」 みたいな謎の用語ができたりしたのはその一世代後ってことか。

[26] 実際問題シェルスクリプトで実用レベルのWebアプリケーション (当時はそんな言葉なかったが) を作るのは困難でちょっとしたツール的なものに使うこともある程度、 Cコンパイルが必要だから当時のレンサバ環境だと利用困難で敬遠されてた (telnet 接続ができるWebサーバーを提供している ISP と契約してるみたいなケース (まあ珍しくはなかったけれど) でないと使えない、 手元でコンパイルして FTP でアップロードすればいいのだけどうまく環境を合わせるのはなかなかハードルが高かろう、 VM とかなかった時代だぞ、サーバーも多分まだ Linux でなくて商用UNIXの何かだしそんなの普通の人の手元にはないよな、クロスコンパイルできたんか?) ので高速化が必要なら C だよねと言われてはいたけど実際使ってた人はどれくらいいたのか (アクセス数が多い商用サービスを提供していたところは使っていたのだろうけど) ってな感じだったから、 消去法でも Perl しかない感じに収束していったのは仕方ないのだろうけど。

メモ