\section{\module{SimpleHTTPServer} ---
         Simple HTTP request handler}

\declaremodule{standard}{SimpleHTTPServer}
\sectionauthor{Moshe Zadka}{moshez@zadka.site.co.il}
\modulesynopsis{This module provides a basic request handler for HTTP
                servers.}


The \module{SimpleHTTPServer} module defines a request-handler class,
interface-compatible with \class{BaseHTTPServer.BaseHTTPRequestHandler},
that serves files only from a base directory.

The \module{SimpleHTTPServer} module defines the following class:

\begin{classdesc}{SimpleHTTPRequestHandler}{request, client_address, server}
This class is used to serve 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 \class{BaseHTTPServer.BaseHTTPRequestHandler}.  This class
implements the \function{do_GET()} and \function{do_HEAD()} functions.
\end{classdesc}

The \class{SimpleHTTPRequestHandler} defines the following member
variables:

\begin{memberdesc}{server_version}
This will be \code{"SimpleHTTP/" + __version__}, where \code{__version__}
is defined in the module.
\end{memberdesc}

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

The \class{SimpleHTTPRequestHandler} defines the following methods:

\begin{methoddesc}{do_HEAD}{}
This method serves the \code{'HEAD'} request type: it sends the
headers it would send for the equivalent \code{GET} request. See the
\method{do_GET()} method for a more complete explanation of the possible
headers.
\end{methoddesc}

\begin{methoddesc}{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 \code{index.html} or \code{index.htm} (in that order).
If found, the file's contents are returned; otherwise a directory
listing is generated by calling the \method{list_directory()} method.
This method uses \function{os.listdir()} to scan the directory, and
returns a \code{404} error response if the \function{listdir()} fails.

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

A \code{'Content-type:'} header with the guessed content type is
output, followed by 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 \code{text/} the file is opened in text mode; otherwise
binary mode is used.

For example usage, see the implementation of the \function{test()}
function.
\end{methoddesc}


\begin{seealso}
  \seemodule{BaseHTTPServer}{Base class implementation for Web server
                             and request handler.}
\end{seealso}
