script

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 ではスクリプトの現在作業ディレクトリーはそのスクリプトがあるディレクトリーに設定されます。 Unix と POSIX 環境ではそのスクリプトがあるディレクトリーに設定されるべきです。 >>13

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

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

文字集合

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

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

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

[18] EBCDIC を使う POSIX ではメタ変数、頭欄、 CHAR、TEXT、 PATH_TRANSLATED に NUL を除く IBM1047 を使います。 NL は LF です。鯖は CRLF も NL として受け付けるべきです。 >>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 しかない感じに収束していったのは仕方ないのだろうけど。

メモ