\section{\module{CGIHTTPServer} --- 
         CGI 実行機能付き HTTP リクエスト処理機構}


\declaremodule{standard}{CGIHTTPServer}
\sectionauthor{Moshe Zadka}{moshez@zadka.site.co.il}
\modulesynopsis{CGI スクリプトの実行機能を持つ HTTP サーバのためのリクエスト処理機構を提供します。}


\module{CGIHTTPServer} モジュールでは、
\class{BaseHTTPServer.BaseHTTPRequestHandler} 互換のインタフェース
を持ち、\class{SimpleHTTPServer.SimpleHTTPRequestHandler} の動作を
継承していますが CGI スクリプトを動作することもできる、
HTTP 要求処理機構クラスを定義しています。

\note{このモジュールは CGI スクリプトを \UNIX{} および Windows システム
上で実行させることができます; Mac OS 上では、自分と同じプロセス内で
Python スクリプトを実行することしかできないはずです。}

\note{ \class{CGIHTTPRequestHandler} クラスで実行されるCGIスクリプトは
 HTTP コード200 (スクリプトの出力が後に続く)を実行に先立って出力される
 (これがステータスコードになります) ため、リダイレクト(コード302)を行
 なうことができません。}

\module{CGIHTTPServer} モジュールでは、以下のクラスを定義しています:

\begin{classdesc}{CGIHTTPRequestHandler}{request, client_address, server}
このクラスは、現在のディレクトリかその下のディレクトリにおいて、ファイルか
CGI スクリプト出力を提供するために使われます。HTTP 階層構造から
ローカルなディレクトリ構造への対応付けは
\class{SimpleHTTPServer.SimpleHTTPRequestHandler} と
全く同じなので注意してください。

このクラスでは、ファイルが CGI スクリプトであると推測された
場合、これをファイルして提供する代わりにスクリプトを実行します。
他の一般的なサーバ設定は特殊な拡張子を使って CGI スクリプトであることを
示すのに対し、ディレクトリベースの CGI だけが使われます。

\function{do_GET()} および \function{do_HEAD()} 関数は、HTTP 要求
が \code{cgi_directories} パス以下のどこかを指している場合、
ファイルを提供するのではなく、CGI スクリプトを実行してその出力を
提供するように変更されています。
\end{classdesc}

\class{CGIHTTPRequestHandler} では以下のデータメンバを定義しています:

\begin{memberdesc}{cgi_directories}
この値は標準で \code{['/cgi-bin', '/htbin']} であり、CGI スクリプト
を含んでいることを示すディレクトリを記述します。
\end{memberdesc}

\class{CGIHTTPRequestHandler} では以下のメソッドを定義しています:

\begin{methoddesc}{do_POST}{}
このメソッドは、CGI スクリプトでのみ許されている \code{'POST'} 
型の HTTP 要求に対するサービスを行います。
CGI でない url に対して POST を試みた場合、出力は
Error 501, "Can only POST to CGI scripts" になります。
\end{methoddesc}

セキュリティ上の理由から、CGI スクリプトはユーザ nobody の UID で動作
するので注意してください。CGI スクリプトが原因で発生した問題は、
Error 403 に変換されます。

使用例については、\function{test()} 関数の実装を参照してください。


\begin{seealso}
  \seemodule{BaseHTTPServer}{Web サーバとリクエスト処理機構を実装した基底クラスです。}
\end{seealso}


