20.19. "SimpleHTTPServer" — Simple HTTP request handler
*******************************************************

Note: The "SimpleHTTPServer" module has been merged into
  "http.server" in Python 3.  The *2to3* tool will automatically adapt
  imports when converting your sources to Python 3.

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

The "SimpleHTTPServer" module defines a single class,
"SimpleHTTPRequestHandler", which is interface-compatible with
"BaseHTTPServer.BaseHTTPRequestHandler".

The "SimpleHTTPServer" module defines the following class:

class SimpleHTTPServer.SimpleHTTPRequestHandler(request, client_address, server)

   This class serves files from the current directory and below,
   directly mapping the directory structure to HTTP requests.

   A lot of the work, such as parsing the request, is done by the base
   class "BaseHTTPServer.BaseHTTPRequestHandler".  This class
   implements the "do_GET()" and "do_HEAD()" functions.

   The following are defined as class-level attributes of
   "SimpleHTTPRequestHandler":

   server_version

   This will be ""SimpleHTTP/" + __version__", where "__version__" is
   defined at the module level.

   extensions_map

      A dictionary mapping suffixes into MIME types. The default is
      signified by an empty string, and is considered to be
      "application/octet-stream". The mapping is used case-
      insensitively, and so should contain only lower-cased keys.

   The "SimpleHTTPRequestHandler" class defines the following methods:

   do_HEAD()

      This method serves the "'HEAD'" request type: it sends the
      headers it would send for the equivalent "GET" request. See the
      "do_GET()" method for a more complete explanation of the
      possible headers.

   do_GET()

      The request is mapped to a local file by interpreting the
      request as a path relative to the current working directory.

      If the request was mapped to a directory, the directory is
      checked for a file named "index.html" or "index.htm" (in that
      order). If found, the file’s contents are returned; otherwise a
      directory listing is generated by calling the "list_directory()"
      method. This method uses "os.listdir()" to scan the directory,
      and returns a "404" error response if the "listdir()" fails.

      If the request was mapped to a file, it is opened and the
      contents are returned.  Any "IOError" exception in opening the
      requested file is mapped to a "404", "'File not found'" error.
      Otherwise, the content type is guessed by calling the
      "guess_type()" method, which in turn uses the *extensions_map*
      variable.

      A "'Content-type:'" header with the guessed content type is
      output, followed by a "'Content-Length:'" header with the file’s
      size and a "'Last-Modified:'" header with the file’s
      modification time.

      Then follows a blank line signifying the end of the headers, and
      then the contents of the file are output. If the file’s MIME
      type starts with "text/" the file is opened in text mode;
      otherwise binary mode is used.

      The "test()" function in the "SimpleHTTPServer" module is an
      example which creates a server using the
      "SimpleHTTPRequestHandler" as the Handler.

      New in version 2.5: The "'Last-Modified'" header.

The "SimpleHTTPServer" module can be used in the following manner in
order to set up a very basic web server serving files relative to the
current directory.

   import SimpleHTTPServer
   import SocketServer

   PORT = 8000

   Handler = SimpleHTTPServer.SimpleHTTPRequestHandler

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

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

The "SimpleHTTPServer" module can also be invoked directly using the
"-m" switch of the interpreter with a "port number" argument. Similar
to the previous example, this serves the files relative to the current
directory.

   python -m SimpleHTTPServer 8000

See also:

  Module "BaseHTTPServer"
     Base class implementation for Web server and request handler.
