20.20. "CGIHTTPServer" --- CGI 実行機能付き HTTP リクエスト処理機構
*******************************************************************

注釈: "BaseHTTPServer" モジュールは Python 3 では "http.server" に統
  合され ました。ソースコードを 3 用に変換する時は、 *2to3* ツールが自
  動的に import を修正します。

"CGIHTTPServer" モジュールでは、
"BaseHTTPServer.BaseHTTPRequestHandler" 互換のインタフェースを持ち、
"SimpleHTTPServer.SimpleHTTPRequestHandler" の動作を継承していますが
CGI スクリプトを動作することもできる、 HTTP リクエストハンドラクラスを
定義しています。

注釈: このモジュールは CGI スクリプトを Unix および Windows システム
  上で実 行させることができます。

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

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

class CGIHTTPServer.CGIHTTPRequestHandler(request, client_address, server)

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

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

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

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

   cgi_directories

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

   "CGIHTTPRequestHandler" では以下のメソッドを定義しています:

   do_POST()

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

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

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

参考:

  "BaseHTTPServer" モジュール
     Web サーバとリクエスト処理機構を実装した基底クラスです。
