# 20 `SimpleHTTPServer` -- 簡潔な HTTP リクエストハンドラ

`SimpleHTTPServer` モジュールはリクエストハンドラ (request-handler) クラスを定義しています。インタフェースは `BaseHTTPServer.BaseHTTPRequestHandler` と互換で、 基底ディレクトリにあるファイルだけを提供します。

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

クラス `SimpleHTTPRequestHandler`( | request, client_address, server)

  このクラスは、現在のディレクトリ以下にあるファイルを、HTTP リクエストにおけるディレクトリ構造に直接対応付けて提供するために 利用されます。

  リクエストの解釈のような、多くの作業は基底クラス `BaseHTTPServer.BaseHTTPRequestHandler` で行われます。 このクラスは関数 `do_GET()` および `do_HEAD()` を実装しています。

`SimpleHTTPRequestHandler` では以下のメンバ変数を定義しています:

`server_version`
  この値は `"SimpleHTTP/" + __version__` になります。 `__version__` はこのモジュールで定義されている値です。

`extensions_map`
  拡張子を MIME 型指定子に対応付ける辞書です。標準の型指定は空文字列で 表され、この値は `application/octet-stream` と見なされます。 対応付けは大小文字の区別をするので、小文字のキーのみを入れるべきです。

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

`do_HEAD`( | )

  このメソッドは `'HEAD'` 型のリクエスト処理を実行します: すなわち、 `GET` リクエストの時に送信されるものと同じヘッダを送信します。 送信される可能性のあるヘッダについての完全な説明は `do_GET()` メソッドを参照してください。

`do_GET`( | )

  リクエストを現在の作業ディレクトリからの相対的なパスとして解釈することで、 リクエストをローカルシステム上のファイルと対応付けます。

  リクエストがディレクトリに対応付けられた場合、`index.html` または`index.htm`をこの順序でチェックします。 もしファイルを発見できればその内容を、そうでなければディレクトリ一覧 を`list_directory()`メソッドで生成して、返します。 このメソッドは`os.listdir()`をディレクトリのスキャンに用いてお り、`listdir()`が失敗した場合には `404` 応答 が返されます。

  リクエストがファイルに対応付けられた場合、そのファイルを開いて内容を 返します。要求されたファイルを開く際に何らかの `IOError` 例外 が送出された場合、リクエストは `404`、`'File not found'` エラーに対応づけられます。そうでない場合、コンテントタイプが extensions_map 変数を用いて推測されます。

  出力は `'Content-type:'` と推測されたコンテントタイプで、その 後にファイルサイズを示す `'Content-Lenght;'` ヘッダと、 ファイルの更新日時を示す `'Last-Modified:'` ヘッダが続きます。

  そしてヘッダの終了を示す空白行が続き、さらにその後にファイルの内容が 続きます。このファイルはコンテントタイプが`text/`で始まっている場合 はテキストモードで、そうでなければバイナリモードで開かれます。

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

  バージョン 2.5 で 新たに追加 された仕様: `'Last-Modified'` ヘッダ

参考:

`BaseHTTPServer`:モジュール
  Web サーバおよび要求ハンドラの基底クラス実装。.