[1] [[CGI]] を介して[[鯖]]とやり取りする[[スクリプト]]を
[DFN[CGIスクリプト]]と言います。ここでいう「[[スクリプト]]」は単独で実行される[[プログラム]]あるいは
“[[スクリプト]]”でなくても、[[ライブラリー]]の類であったり、静的に組み込まれた[[関数]]のようなものですらあっても構いません。

[4] 俗に、[[CGIスクリプト]]を指して単に「[[CGI]]」と呼ぶこともあります。

[5] [[CGI]] の仕様書内では単に[DFN[[RUBYB[スクリプト]@en[script]]]]と呼ばれています。

* 仕様書

[REFS[
- [6] [CITE@en[RFC 3875 - The Common Gateway Interface (CGI) Version 1.1]] 
-- [2] '''<http://tools.ietf.org/html/rfc3875#section-1.4>'''
-- [7] <http://tools.ietf.org/html/rfc3875#section-3.4>
-- [13] <http://tools.ietf.org/html/rfc3875#section-7>
]REFS]

* 定義

[FIG(quote)[
[3] 
>
:[DFN[[RUBYB[スクリプト]@en[script]]]]:
本[[界面]]に従って[[鯖]]から呼び出される[[ソフトウェア]]。
単独の[[プログラム]]である必要はなく、動的に読み込まれる (共有) ライブラリーでも構いませんし、
もっと言えば[[鯖]]の[[手続き]]であっても構いません。「[[スクリプト]]」
という用語はよく[[実行時]]に解釈される[[文]]の集合体と理解されたりしますが、
それは要件ではなく、本仕様の文脈にあってはより広い定義を持っています。

[FIGCAPTION(source)[
[SRC[>>2]]
]FIGCAPTION]
]FIG]

* 処理

** 実行

[8] 別途規定がない限り、[[CGIスクリプト]]を含んだ[[ファイル]]は[[実行可能プログラム]]として呼び出されます
[SRC[>>7]]。

[9] [[CGIスクリプト]]は[[鯖]]から[[メタ変数]]および要求メッセージ・データを受け取ります。
[[鯖]]はこの要求メッセージ・データを直ちに[[CGIスクリプト]]から利用可能とする必要はなく、
その準備ができていない段階であっても ([[クライアント]]から到着していない段階であっても)
[[CGIスクリプト]]を起動して構いません。 [SRC[>>7]]

[10] [[CGIスクリプト]]は[[鯖]]に対して[[標準出力]]などの方法で結果を引き渡します。

** 実行の中断

[11] [[鯖]]は[[誤り]]が発生したらいつでも警告無く[[CGIスクリプト]]の実行を[RUBYB[中断]@en[interrupt]]、
[RUBYB[終了]@en[terminate]]できます。例えば[[鯖]]と[[クライアント]]の通信路で失敗があったときに実行を中断して構いません。
従って[[CGIスクリプト]]は非正常な終了を処理できるように準備する[['''べきです''']]。 [SRC[>>7]]

[12] [[鯖]]は[[タイムアウト]]により[[スクリプト]]を中断させても構いません。

[20] 例えば、[[CGIスクリプト]]は[[プッシュ]]などの目的で無限に長い[[応答]]を返すことがあります。
[[HTTPクライアント]]が[[HTTP接続]]を閉じることで[[HTTPサーバー]]からの[[応答]]の送信は終了することになりますが、
そのままでは[[CGIスクリプト]]が[[HTTPサーバー]]に[[応答]]を送り続けますから、
[[HTTPサーバー]]はこれを停止させなければなりません。

** 現在作業ディレクトリー

[14] [[AmigaDOS]] では[[スクリプト]]の[[現在作業ディレクトリー]]はその[[スクリプト]]がある[[ディレクトリー]]に設定されます。
[[Unix]] と [[POSIX]] 環境ではその[[スクリプト]]がある[[ディレクトリー]]に設定される[['''べきです''']]。
[SRC[>>13]]

;; [15] [[AmigaDOS]] についてはなぜか[[要件]]ではなく[[事実][事実の文]]として [[RFC]] で説明されています。

[19] [[IIS]] は [[CGIスクリプト]]の実行時に[[現在作業ディレクトリー]]を変更しておらず、
[[世間]]では[[不具合]]であると認識されていましたが、その後修正されたかどうかは未確認です。

** 文字集合

[16] [[AmigaDOS]] では[[メタ変数]]や[[頭欄]]で [[US-ASCII]] を使います。
[[NL]] は [[LF]] です。[[鯖]]は [[CRLF]] も [[NL]] として受け付ける[['''べきです''']]。
[SRC[>>13]]

[17] [[Unix]] では[[メタ変数]]、[[頭欄]]、 [[CHAR]] に [CODE(charname)@en[[[NUL]]]]
を除く [[US-ASCII]] を使います。 [[TEXT]] には [[ISO-8859-1]] を使います。
[CODE(CGI)@en[[[PATH_TRANSLATED]]]] には [CODE(charname)@en[[[NUL]]]] 以外の任意の[[8ビット・バイト]]を使います。
[[NL]] は [[LF]] です。[[鯖]]は [[CRLF]] も [[NL]] として受け付ける[['''べきです''']]。
[SRC[>>13]]

;; [21] [[Unix]] では ([[C]] では) [CODE(charname)@en[NULL]] は[[文字列]]の終端を表します。
[[HTTPサーバー]]は[[要求]]に含まれる [CODE(charname)@en[NULL]] を適切に処理しないと、
[[CGIスクリプト]]を誤動作させることができるかもしれず、注意が必要です。

[18] [[EBCDIC]] を使う [[POSIX]] では[[メタ変数]]、[[頭欄]]、 [[CHAR]]、[[TEXT]]、
[CODE(CGI)@en[[[PATH_TRANSLATED]]]] に [CODE(charname)@en[[[NUL]]]]
を除く [[IBM1047]] を使います。
[[NL]] は [[LF]] です。[[鯖]]は [[CRLF]] も [[NL]] として受け付ける[['''べきです''']]。
[SRC[>>13]]

* 言語

[22] [[CGI]] で取り扱う構造を扱える[[プログラミング言語]]であれば、どんな[[言語][プログラミング言語]]でも[[CGIスクリプト]]を記述できます。

[FIG(short list)[ [23] [[CGIスクリプト]]によく用いられた[[言語][プログラミング言語]]
- [[Perl]]
- [[C]]
- [[PHP]]
- [[Ruby]]
- [[C++]]
- [[シェルスクリプト]]
- [[Visual Basic]]
]FIG]


[24] 
初期も初期の解説だと [[Perl]] だけでなく [[C]] とか[[シェルスクリプト]]とか複数の言語に言及してなんなら複数の例文が載ってたりもするのが普通だったよな、そういえば。

[25] 
[[CGI]] = [[Perl]] なんておかしなこと言い出す人が出てきたり 「CGI/Perl」
みたいな謎の用語ができたりしたのはその一世代後ってことか。


[26] 
実際問題[[シェルスクリプト]]で実用レベルの[[Webアプリケーション]] (当時はそんな言葉なかったが) を作るのは困難でちょっとしたツール的なものに使うこともある程度、
[[C]] は[[コンパイル]]が必要だから当時のレンサバ環境だと利用困難で敬遠されてた
([CODE[telnet]] 接続ができるWebサーバーを提供している [[ISP]] と契約してるみたいなケース (まあ珍しくはなかったけれど) でないと使えない、
手元でコンパイルして [[FTP]] でアップロードすればいいのだけどうまく環境を合わせるのはなかなかハードルが高かろう、 [[VM]] とかなかった時代だぞ、サーバーも多分まだ [[Linux]] でなくて商用UNIXの何かだしそんなの普通の人の手元にはないよな、[[クロスコンパイル]]できたんか?)
ので高速化が必要なら [[C]] だよねと言われてはいたけど実際使ってた人はどれくらいいたのか
(アクセス数が多い商用サービスを提供していたところは使っていたのだろうけど)
ってな感じだったから、 
消去法でも [[Perl]] しかない感じに収束していったのは仕方ないのだろうけど。






* メモ