# 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 サーバとリクエスト処理機構を実装した基底クラスです。