20.19. "SimpleHTTPServer" --- 簡潔な HTTP リクエストハンドラ
************************************************************

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

警告: "SimpleHTTPServer" is not recommended for production. It only
  implements basic security checks.

"SimpleHTTPServer" モジュールは、 "SimpleHTTPRequestHandler" クラス 1
つを提供しています。このクラスは、
"BaseHTTPServer.BaseHTTPRequestHandler" に対して互換性のあるインタフェ
ースを持っています。

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

class 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* 変数を
      用いて "guess_type()"  メソッドにより content-type が推測されま
      す。

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

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

      "SimpleHTTPServer" モジュールの "test()" 関数は
      "SimpleHTTPRequestHandler" をハンドラとして使うサーバを作る例に
      なっています。

      バージョン 2.5 で追加: "'Last-Modified'" ヘッダ.

"SimpleHTTPServer" モジュールを使って現在のディレクトリ以下にあるファ
イルにアクセスできるだけの、非常に初歩的な Web サーバを立ち上げる方法
は以下の通りです。

   import SimpleHTTPServer
   import SocketServer

   PORT = 8000

   Handler = SimpleHTTPServer.SimpleHTTPRequestHandler

   httpd = SocketServer.TCPServer(("", PORT), Handler)

   print "serving at port", PORT
   httpd.serve_forever()

インタプリタの "-m" スイッチで "SimpleHTTPServer" モジュールと "ポート
番号" を指定して直接実行することもできます。上の例と同じように、ここで
立ち上がったサーバは現在のディレクトリ以下のファイルへのアクセスを提供
します。

   python -m SimpleHTTPServer 8000

参考:

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