| 
									
										
										
										
											2024-05-08 15:34:40 -04:00
										 |  |  | :mod:`!http.server` --- HTTP servers
 | 
					
						
							|  |  |  | ====================================
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-26 16:32:26 +00:00
										 |  |  | .. module:: http.server
 | 
					
						
							|  |  |  |    :synopsis: HTTP server and request handlers.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-11 15:02:54 -04:00
										 |  |  | **Source code:** :source:`Lib/http/server.py`
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. index::
 | 
					
						
							|  |  |  |    pair: WWW; server
 | 
					
						
							|  |  |  |    pair: HTTP; protocol
 | 
					
						
							|  |  |  |    single: URL
 | 
					
						
							|  |  |  |    single: httpd
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-27 20:38:46 +00:00
										 |  |  | --------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-27 10:57:52 +02:00
										 |  |  | This module defines classes for implementing HTTP servers.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-10 23:43:40 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-20 11:32:07 -07:00
										 |  |  | .. warning::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-26 06:43:37 -07:00
										 |  |  |     :mod:`http.server` is not recommended for production. It only implements
 | 
					
						
							| 
									
										
										
										
											2022-07-01 17:21:27 +01:00
										 |  |  |     :ref:`basic security checks <http.server-security>`.
 | 
					
						
							| 
									
										
										
										
											2018-10-10 23:43:40 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-02 21:00:41 +02:00
										 |  |  | .. include:: ../includes/wasm-notavail.rst
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-26 16:32:26 +00:00
										 |  |  | One class, :class:`HTTPServer`, is a :class:`socketserver.TCPServer` subclass.
 | 
					
						
							|  |  |  | It creates and listens at the HTTP socket, dispatching the requests to a
 | 
					
						
							|  |  |  | handler.  Code to create and run the server looks like this::
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-26 16:32:26 +00:00
										 |  |  |    def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  |        server_address = ('', 8000)
 | 
					
						
							|  |  |  |        httpd = server_class(server_address, handler_class)
 | 
					
						
							|  |  |  |        httpd.serve_forever()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. class:: HTTPServer(server_address, RequestHandlerClass)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-13 23:09:14 +03:00
										 |  |  |    This class builds on the :class:`~socketserver.TCPServer` class by storing
 | 
					
						
							|  |  |  |    the server address as instance variables named :attr:`server_name` and
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    :attr:`server_port`. The server is accessible by the handler, typically
 | 
					
						
							|  |  |  |    through the handler's :attr:`server` instance variable.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-29 22:10:30 +02:00
										 |  |  | .. class:: ThreadingHTTPServer(server_address, RequestHandlerClass)
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-23 17:40:33 +01:00
										 |  |  |    This class is identical to HTTPServer but uses threads to handle
 | 
					
						
							| 
									
										
										
										
											2018-04-06 08:26:49 -04:00
										 |  |  |    requests by using the :class:`~socketserver.ThreadingMixIn`. This
 | 
					
						
							| 
									
										
										
										
											2018-03-28 23:24:58 +02:00
										 |  |  |    is useful to handle web browsers pre-opening sockets, on which
 | 
					
						
							|  |  |  |    :class:`HTTPServer` would wait indefinitely.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.7
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-23 17:40:33 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-29 22:10:30 +02:00
										 |  |  | The :class:`HTTPServer` and :class:`ThreadingHTTPServer` must be given
 | 
					
						
							| 
									
										
										
										
											2018-03-23 17:40:33 +01:00
										 |  |  | a *RequestHandlerClass* on instantiation, of which this module
 | 
					
						
							|  |  |  | provides three different variants:
 | 
					
						
							| 
									
										
										
										
											2008-05-26 16:32:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | .. class:: BaseHTTPRequestHandler(request, client_address, server)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-26 16:32:26 +00:00
										 |  |  |    This class is used to handle the HTTP requests that arrive at the server.  By
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    itself, it cannot respond to any actual HTTP requests; it must be subclassed
 | 
					
						
							| 
									
										
										
										
											2008-05-26 16:32:26 +00:00
										 |  |  |    to handle each request method (e.g. GET or POST).
 | 
					
						
							|  |  |  |    :class:`BaseHTTPRequestHandler` provides a number of class and instance
 | 
					
						
							|  |  |  |    variables, and methods for use by subclasses.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    The handler will parse the request and the headers, then call a method
 | 
					
						
							|  |  |  |    specific to the request type. The method name is constructed from the
 | 
					
						
							| 
									
										
										
										
											2023-12-13 09:24:55 +02:00
										 |  |  |    request. For example, for the request method ``SPAM``, the :meth:`!do_SPAM`
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    method will be called with no arguments. All of the relevant information is
 | 
					
						
							|  |  |  |    stored in instance variables of the handler.  Subclasses should not need to
 | 
					
						
							| 
									
										
										
										
											2023-12-13 09:24:55 +02:00
										 |  |  |    override or extend the :meth:`!__init__` method.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    :class:`BaseHTTPRequestHandler` has the following instance variables:
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. attribute:: client_address
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |       Contains a tuple of the form ``(host, port)`` referring to the client's
 | 
					
						
							|  |  |  |       address.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 66045,66048-66049,66053,66060,66062-66063,66065,66067,66071-66074,66080,66082-66083,66090-66093,66097-66099,66103,66105,66110,66118 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r66045 | andrew.kuchling | 2008-08-26 19:27:18 -0500 (Tue, 26 Aug 2008) | 1 line
  Trim whitespace; add a few updates
........
  r66048 | andrew.kuchling | 2008-08-26 19:45:02 -0500 (Tue, 26 Aug 2008) | 1 line
  Add an item and a note
........
  r66049 | andrew.kuchling | 2008-08-26 21:12:18 -0500 (Tue, 26 Aug 2008) | 1 line
  Add various items
........
  r66053 | georg.brandl | 2008-08-28 04:40:18 -0500 (Thu, 28 Aug 2008) | 2 lines
  #3711: .dll isn't a valid Python extension anymore.
........
  r66060 | armin.rigo | 2008-08-29 16:21:52 -0500 (Fri, 29 Aug 2008) | 3 lines
  A collection of crashers, all variants of the idea
  of issue #3720.
........
  r66062 | georg.brandl | 2008-08-30 04:49:36 -0500 (Sat, 30 Aug 2008) | 2 lines
  #3730: mention "server" attribute explicitly.
........
  r66063 | georg.brandl | 2008-08-30 04:52:44 -0500 (Sat, 30 Aug 2008) | 2 lines
  #3716: fix typo.
........
  r66065 | georg.brandl | 2008-08-30 05:03:09 -0500 (Sat, 30 Aug 2008) | 2 lines
  #3569: eval() also accepts "exec"able code objects.
........
  r66067 | georg.brandl | 2008-08-30 08:17:39 -0500 (Sat, 30 Aug 2008) | 2 lines
  super() actually returns a super object.
........
  r66071 | andrew.kuchling | 2008-08-30 10:19:57 -0500 (Sat, 30 Aug 2008) | 1 line
  Partial edits from revision and tidying pass
........
  r66072 | andrew.kuchling | 2008-08-30 10:21:23 -0500 (Sat, 30 Aug 2008) | 1 line
  Tidy up some sentences
........
  r66073 | andrew.kuchling | 2008-08-30 10:25:47 -0500 (Sat, 30 Aug 2008) | 1 line
  Correction from Antoine Pitrou: BufferedWriter and Reader support seek()
........
  r66074 | andrew.kuchling | 2008-08-30 11:44:54 -0500 (Sat, 30 Aug 2008) | 1 line
  Edit four more sections
........
  r66080 | georg.brandl | 2008-08-30 17:00:28 -0500 (Sat, 30 Aug 2008) | 2 lines
  Fix markup.
........
  r66082 | andrew.kuchling | 2008-08-30 17:56:54 -0500 (Sat, 30 Aug 2008) | 1 line
  More edits; markup fixes
........
  r66083 | andrew.kuchling | 2008-08-30 21:24:08 -0500 (Sat, 30 Aug 2008) | 1 line
  More edits
........
  r66090 | andrew.kuchling | 2008-08-31 09:29:31 -0500 (Sun, 31 Aug 2008) | 1 line
  Edit the library section, rearranging items to flow better and making lots of edits
........
  r66091 | andrew.kuchling | 2008-08-31 10:41:48 -0500 (Sun, 31 Aug 2008) | 1 line
  Last batch of edits; remove the 'other changes' section
........
  r66092 | andrew.kuchling | 2008-08-31 10:48:44 -0500 (Sun, 31 Aug 2008) | 1 line
  Update patch/bug count
........
  r66093 | gregory.p.smith | 2008-08-31 11:34:18 -0500 (Sun, 31 Aug 2008) | 3 lines
  issue3715: docstring representation of hex escaped string needs to be double
  escaped.
........
  r66097 | benjamin.peterson | 2008-09-01 09:13:43 -0500 (Mon, 01 Sep 2008) | 4 lines
  #3703 unhelpful _fileio.FileIO error message when trying to open a directory
  Reviewer: Gregory P. Smith
........
  r66098 | georg.brandl | 2008-09-01 09:15:55 -0500 (Mon, 01 Sep 2008) | 2 lines
  #3749: fix c'n'p errors.
........
  r66099 | benjamin.peterson | 2008-09-01 09:18:30 -0500 (Mon, 01 Sep 2008) | 4 lines
  Fix compilation when --without-threads is given #3683
  Reviewer: Georg Brandl, Benjamin Peterson
........
  r66103 | vinay.sajip | 2008-09-01 09:30:10 -0500 (Mon, 01 Sep 2008) | 1 line
  logging: fixed lack of use of encoding attribute specified on a stream.
........
  r66105 | vinay.sajip | 2008-09-01 09:33:59 -0500 (Mon, 01 Sep 2008) | 1 line
  logging: fixed lack of use of encoding attribute specified on a stream.
........
  r66110 | vinay.sajip | 2008-09-01 10:08:07 -0500 (Mon, 01 Sep 2008) | 1 line
  Added section about configuring logging in a library. Thanks to Thomas Heller for the idea.
........
  r66118 | vinay.sajip | 2008-09-01 12:44:14 -0500 (Mon, 01 Sep 2008) | 1 line
  Bug #3738: Documentation is now more accurate in describing handler close methods.
........
											
										 
											2008-09-02 00:31:15 +00:00
										 |  |  |    .. attribute:: server
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Contains the server instance.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-17 21:11:10 -05:00
										 |  |  |    .. attribute:: close_connection
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Boolean that should be set before :meth:`handle_one_request` returns,
 | 
					
						
							|  |  |  |       indicating if another request may be expected, or if the connection should
 | 
					
						
							|  |  |  |       be shut down.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. attribute:: requestline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Contains the string representation of the HTTP request line. The
 | 
					
						
							|  |  |  |       terminating CRLF is stripped. This attribute should be set by
 | 
					
						
							|  |  |  |       :meth:`handle_one_request`. If no valid request line was processed, it
 | 
					
						
							|  |  |  |       should be set to the empty string.
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 66045,66048-66049,66053,66060,66062-66063,66065,66067,66071-66074,66080,66082-66083,66090-66093,66097-66099,66103,66105,66110,66118 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r66045 | andrew.kuchling | 2008-08-26 19:27:18 -0500 (Tue, 26 Aug 2008) | 1 line
  Trim whitespace; add a few updates
........
  r66048 | andrew.kuchling | 2008-08-26 19:45:02 -0500 (Tue, 26 Aug 2008) | 1 line
  Add an item and a note
........
  r66049 | andrew.kuchling | 2008-08-26 21:12:18 -0500 (Tue, 26 Aug 2008) | 1 line
  Add various items
........
  r66053 | georg.brandl | 2008-08-28 04:40:18 -0500 (Thu, 28 Aug 2008) | 2 lines
  #3711: .dll isn't a valid Python extension anymore.
........
  r66060 | armin.rigo | 2008-08-29 16:21:52 -0500 (Fri, 29 Aug 2008) | 3 lines
  A collection of crashers, all variants of the idea
  of issue #3720.
........
  r66062 | georg.brandl | 2008-08-30 04:49:36 -0500 (Sat, 30 Aug 2008) | 2 lines
  #3730: mention "server" attribute explicitly.
........
  r66063 | georg.brandl | 2008-08-30 04:52:44 -0500 (Sat, 30 Aug 2008) | 2 lines
  #3716: fix typo.
........
  r66065 | georg.brandl | 2008-08-30 05:03:09 -0500 (Sat, 30 Aug 2008) | 2 lines
  #3569: eval() also accepts "exec"able code objects.
........
  r66067 | georg.brandl | 2008-08-30 08:17:39 -0500 (Sat, 30 Aug 2008) | 2 lines
  super() actually returns a super object.
........
  r66071 | andrew.kuchling | 2008-08-30 10:19:57 -0500 (Sat, 30 Aug 2008) | 1 line
  Partial edits from revision and tidying pass
........
  r66072 | andrew.kuchling | 2008-08-30 10:21:23 -0500 (Sat, 30 Aug 2008) | 1 line
  Tidy up some sentences
........
  r66073 | andrew.kuchling | 2008-08-30 10:25:47 -0500 (Sat, 30 Aug 2008) | 1 line
  Correction from Antoine Pitrou: BufferedWriter and Reader support seek()
........
  r66074 | andrew.kuchling | 2008-08-30 11:44:54 -0500 (Sat, 30 Aug 2008) | 1 line
  Edit four more sections
........
  r66080 | georg.brandl | 2008-08-30 17:00:28 -0500 (Sat, 30 Aug 2008) | 2 lines
  Fix markup.
........
  r66082 | andrew.kuchling | 2008-08-30 17:56:54 -0500 (Sat, 30 Aug 2008) | 1 line
  More edits; markup fixes
........
  r66083 | andrew.kuchling | 2008-08-30 21:24:08 -0500 (Sat, 30 Aug 2008) | 1 line
  More edits
........
  r66090 | andrew.kuchling | 2008-08-31 09:29:31 -0500 (Sun, 31 Aug 2008) | 1 line
  Edit the library section, rearranging items to flow better and making lots of edits
........
  r66091 | andrew.kuchling | 2008-08-31 10:41:48 -0500 (Sun, 31 Aug 2008) | 1 line
  Last batch of edits; remove the 'other changes' section
........
  r66092 | andrew.kuchling | 2008-08-31 10:48:44 -0500 (Sun, 31 Aug 2008) | 1 line
  Update patch/bug count
........
  r66093 | gregory.p.smith | 2008-08-31 11:34:18 -0500 (Sun, 31 Aug 2008) | 3 lines
  issue3715: docstring representation of hex escaped string needs to be double
  escaped.
........
  r66097 | benjamin.peterson | 2008-09-01 09:13:43 -0500 (Mon, 01 Sep 2008) | 4 lines
  #3703 unhelpful _fileio.FileIO error message when trying to open a directory
  Reviewer: Gregory P. Smith
........
  r66098 | georg.brandl | 2008-09-01 09:15:55 -0500 (Mon, 01 Sep 2008) | 2 lines
  #3749: fix c'n'p errors.
........
  r66099 | benjamin.peterson | 2008-09-01 09:18:30 -0500 (Mon, 01 Sep 2008) | 4 lines
  Fix compilation when --without-threads is given #3683
  Reviewer: Georg Brandl, Benjamin Peterson
........
  r66103 | vinay.sajip | 2008-09-01 09:30:10 -0500 (Mon, 01 Sep 2008) | 1 line
  logging: fixed lack of use of encoding attribute specified on a stream.
........
  r66105 | vinay.sajip | 2008-09-01 09:33:59 -0500 (Mon, 01 Sep 2008) | 1 line
  logging: fixed lack of use of encoding attribute specified on a stream.
........
  r66110 | vinay.sajip | 2008-09-01 10:08:07 -0500 (Mon, 01 Sep 2008) | 1 line
  Added section about configuring logging in a library. Thanks to Thomas Heller for the idea.
........
  r66118 | vinay.sajip | 2008-09-01 12:44:14 -0500 (Mon, 01 Sep 2008) | 1 line
  Bug #3738: Documentation is now more accurate in describing handler close methods.
........
											
										 
											2008-09-02 00:31:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. attribute:: command
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |       Contains the command (request type). For example, ``'GET'``.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. attribute:: path
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-25 10:08:29 -07:00
										 |  |  |       Contains the request path. If query component of the URL is present,
 | 
					
						
							|  |  |  |       then ``path`` includes the query. Using the terminology of :rfc:`3986`,
 | 
					
						
							|  |  |  |       ``path`` here includes ``hier-part`` and the ``query``.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. attribute:: request_version
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |       Contains the version string from the request. For example, ``'HTTP/1.0'``.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. attribute:: headers
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |       Holds an instance of the class specified by the :attr:`MessageClass` class
 | 
					
						
							|  |  |  |       variable. This instance parses and manages the headers in the HTTP
 | 
					
						
							| 
									
										
										
										
											2014-04-16 13:56:19 -04:00
										 |  |  |       request. The :func:`~http.client.parse_headers` function from
 | 
					
						
							|  |  |  |       :mod:`http.client` is used to parse the headers and it requires that the
 | 
					
						
							|  |  |  |       HTTP request provide a valid :rfc:`2822` style header.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. attribute:: rfile
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-29 10:12:22 +00:00
										 |  |  |       An :class:`io.BufferedIOBase` input stream, ready to read from
 | 
					
						
							|  |  |  |       the start of the optional input data.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. attribute:: wfile
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |       Contains the output stream for writing a response back to the
 | 
					
						
							|  |  |  |       client. Proper adherence to the HTTP protocol must be used when writing to
 | 
					
						
							| 
									
										
										
										
											2017-05-24 14:25:50 -04:00
										 |  |  |       this stream in order to achieve successful interoperation with HTTP
 | 
					
						
							|  |  |  |       clients.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-29 10:12:22 +00:00
										 |  |  |       .. versionchanged:: 3.6
 | 
					
						
							|  |  |  |          This is an :class:`io.BufferedIOBase` stream.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-24 01:51:02 +03:00
										 |  |  |    :class:`BaseHTTPRequestHandler` has the following attributes:
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. attribute:: server_version
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |       Specifies the server software version.  You may want to override this. The
 | 
					
						
							|  |  |  |       format is multiple whitespace-separated strings, where each string is of
 | 
					
						
							|  |  |  |       the form name[/version]. For example, ``'BaseHTTP/0.2'``.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. attribute:: sys_version
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |       Contains the Python system version, in a form usable by the
 | 
					
						
							|  |  |  |       :attr:`version_string` method and the :attr:`server_version` class
 | 
					
						
							|  |  |  |       variable. For example, ``'Python/1.4'``.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. attribute:: error_message_format
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-24 01:51:02 +03:00
										 |  |  |       Specifies a format string that should be used by :meth:`send_error` method
 | 
					
						
							|  |  |  |       for building an error response to the client. The string is filled by
 | 
					
						
							|  |  |  |       default with variables from :attr:`responses` based on the status code
 | 
					
						
							|  |  |  |       that passed to :meth:`send_error`.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. attribute:: error_content_type
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900,60902-60906,60908,60911-60917,60919-60920,60922,60926,60929-60931,60933-60935,60937,60939-60941,60943-60954,60959-60961,60963-60964,60966-60967,60971,60977,60979-60989 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r60980 | georg.brandl | 2008-02-23 16:02:28 +0100 (Sat, 23 Feb 2008) | 2 lines
  #1492: allow overriding BaseHTTPServer's content type for error messages.
........
  r60982 | georg.brandl | 2008-02-23 16:06:25 +0100 (Sat, 23 Feb 2008) | 2 lines
  #2165: fix test_logging failure on some machines.
........
  r60983 | facundo.batista | 2008-02-23 16:07:35 +0100 (Sat, 23 Feb 2008) | 6 lines
  Issue 1089358.  Adds the siginterrupt() function, that is just a
  wrapper around the system call with the same name.  Also added
  test cases, doc changes and NEWS entry. Thanks Jason and Ralf
  Schmitt.
........
  r60984 | georg.brandl | 2008-02-23 16:11:18 +0100 (Sat, 23 Feb 2008) | 2 lines
  #2067: file.__exit__() now calls subclasses' close() method.
........
  r60985 | georg.brandl | 2008-02-23 16:19:54 +0100 (Sat, 23 Feb 2008) | 2 lines
  More difflib examples. Written for GHOP by Josip Dzolonga.
........
  r60987 | andrew.kuchling | 2008-02-23 16:41:51 +0100 (Sat, 23 Feb 2008) | 1 line
  #2072: correct documentation for .rpc_paths
........
  r60988 | georg.brandl | 2008-02-23 16:43:48 +0100 (Sat, 23 Feb 2008) | 2 lines
  #2161: Fix opcode name.
........
  r60989 | andrew.kuchling | 2008-02-23 16:49:35 +0100 (Sat, 23 Feb 2008) | 2 lines
  #1119331: ncurses will just call exit() if the terminal name isn't found.
  Call setupterm() first so that we get a Python exception instead of just existing.
........
											
										 
											2008-02-23 16:23:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |       Specifies the Content-Type HTTP header of error responses sent to the
 | 
					
						
							|  |  |  |       client.  The default value is ``'text/html'``.
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60789,60793,60796,60799-60809,60812-60813,60815-60821,60823-60826,60828-60829,60831-60834,60836,60838-60839,60846-60849,60852-60854,60856-60859,60861-60870,60874-60875,60880-60881,60886,60888-60890,60892,60894-60898,60900,60902-60906,60908,60911-60917,60919-60920,60922,60926,60929-60931,60933-60935,60937,60939-60941,60943-60954,60959-60961,60963-60964,60966-60967,60971,60977,60979-60989 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r60980 | georg.brandl | 2008-02-23 16:02:28 +0100 (Sat, 23 Feb 2008) | 2 lines
  #1492: allow overriding BaseHTTPServer's content type for error messages.
........
  r60982 | georg.brandl | 2008-02-23 16:06:25 +0100 (Sat, 23 Feb 2008) | 2 lines
  #2165: fix test_logging failure on some machines.
........
  r60983 | facundo.batista | 2008-02-23 16:07:35 +0100 (Sat, 23 Feb 2008) | 6 lines
  Issue 1089358.  Adds the siginterrupt() function, that is just a
  wrapper around the system call with the same name.  Also added
  test cases, doc changes and NEWS entry. Thanks Jason and Ralf
  Schmitt.
........
  r60984 | georg.brandl | 2008-02-23 16:11:18 +0100 (Sat, 23 Feb 2008) | 2 lines
  #2067: file.__exit__() now calls subclasses' close() method.
........
  r60985 | georg.brandl | 2008-02-23 16:19:54 +0100 (Sat, 23 Feb 2008) | 2 lines
  More difflib examples. Written for GHOP by Josip Dzolonga.
........
  r60987 | andrew.kuchling | 2008-02-23 16:41:51 +0100 (Sat, 23 Feb 2008) | 1 line
  #2072: correct documentation for .rpc_paths
........
  r60988 | georg.brandl | 2008-02-23 16:43:48 +0100 (Sat, 23 Feb 2008) | 2 lines
  #2161: Fix opcode name.
........
  r60989 | andrew.kuchling | 2008-02-23 16:49:35 +0100 (Sat, 23 Feb 2008) | 2 lines
  #1119331: ncurses will just call exit() if the terminal name isn't found.
  Call setupterm() first so that we get a Python exception instead of just existing.
........
											
										 
											2008-02-23 16:23:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. attribute:: protocol_version
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-03 00:28:45 +02:00
										 |  |  |       Specifies the HTTP version to which the server is conformant. It is sent
 | 
					
						
							|  |  |  |       in responses to let the client know the server's communication
 | 
					
						
							|  |  |  |       capabilities for future requests. If set to
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |       ``'HTTP/1.1'``, the server will permit HTTP persistent connections;
 | 
					
						
							|  |  |  |       however, your server *must* then include an accurate ``Content-Length``
 | 
					
						
							|  |  |  |       header (using :meth:`send_header`) in all of its responses to clients.
 | 
					
						
							|  |  |  |       For backwards compatibility, the setting defaults to ``'HTTP/1.0'``.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. attribute:: MessageClass
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-12 18:52:31 +00:00
										 |  |  |       Specifies an :class:`email.message.Message`\ -like class to parse HTTP
 | 
					
						
							|  |  |  |       headers.  Typically, this is not overridden, and it defaults to
 | 
					
						
							|  |  |  |       :class:`http.client.HTTPMessage`.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. attribute:: responses
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-24 01:51:02 +03:00
										 |  |  |       This attribute contains a mapping of error code integers to two-element tuples
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |       containing a short and long message. For example, ``{code: (shortmessage,
 | 
					
						
							|  |  |  |       longmessage)}``. The *shortmessage* is usually used as the *message* key in an
 | 
					
						
							| 
									
										
										
										
											2016-04-24 01:51:02 +03:00
										 |  |  |       error response, and *longmessage* as the *explain* key.  It is used by
 | 
					
						
							|  |  |  |       :meth:`send_response_only` and :meth:`send_error` methods.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    A :class:`BaseHTTPRequestHandler` instance has the following methods:
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. method:: handle()
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |       Calls :meth:`handle_one_request` once (or, if persistent connections are
 | 
					
						
							|  |  |  |       enabled, multiple times) to handle incoming HTTP requests. You should
 | 
					
						
							| 
									
										
										
										
											2023-12-13 09:24:55 +02:00
										 |  |  |       never need to override it; instead, implement appropriate :meth:`!do_\*`
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |       methods.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. method:: handle_one_request()
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |       This method will parse and dispatch the request to the appropriate
 | 
					
						
							| 
									
										
										
										
											2023-12-13 09:24:55 +02:00
										 |  |  |       :meth:`!do_\*` method.  You should never need to override it.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-30 06:09:18 +00:00
										 |  |  |    .. method:: handle_expect_100()
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-03 00:28:45 +02:00
										 |  |  |       When an HTTP/1.1 conformant server receives an ``Expect: 100-continue``
 | 
					
						
							| 
									
										
										
										
											2010-09-30 06:09:18 +00:00
										 |  |  |       request header it responds back with a ``100 Continue`` followed by ``200
 | 
					
						
							|  |  |  |       OK`` headers.
 | 
					
						
							|  |  |  |       This method can be overridden to raise an error if the server does not
 | 
					
						
							| 
									
										
										
										
											2021-07-29 12:55:04 -04:00
										 |  |  |       want the client to continue.  For e.g. server can choose to send ``417
 | 
					
						
							| 
									
										
										
										
											2010-09-30 06:09:18 +00:00
										 |  |  |       Expectation Failed`` as a response header and ``return False``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       .. versionadded:: 3.2
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-15 07:53:21 -07:00
										 |  |  |    .. method:: send_error(code, message=None, explain=None)
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |       Sends and logs a complete error reply to the client. The numeric *code*
 | 
					
						
							| 
									
										
										
										
											2014-01-03 13:03:00 -05:00
										 |  |  |       specifies the HTTP error code, with *message* as an optional, short, human
 | 
					
						
							|  |  |  |       readable description of the error.  The *explain* argument can be used to
 | 
					
						
							|  |  |  |       provide more detailed information about the error; it will be formatted
 | 
					
						
							| 
									
										
										
										
											2016-04-24 01:51:02 +03:00
										 |  |  |       using the :attr:`error_message_format` attribute and emitted, after
 | 
					
						
							| 
									
										
										
										
											2014-01-03 13:03:00 -05:00
										 |  |  |       a complete set of headers, as the response body.  The :attr:`responses`
 | 
					
						
							| 
									
										
										
										
											2016-04-24 01:51:02 +03:00
										 |  |  |       attribute holds the default values for *message* and *explain* that
 | 
					
						
							| 
									
										
										
										
											2014-01-03 13:03:00 -05:00
										 |  |  |       will be used if no value is provided; for unknown codes the default value
 | 
					
						
							| 
									
										
										
										
											2016-06-08 08:29:13 +00:00
										 |  |  |       for both is the string ``???``. The body will be empty if the method is
 | 
					
						
							| 
									
										
										
										
											2023-09-23 09:31:20 +03:00
										 |  |  |       HEAD or the response code is one of the following: :samp:`1{xx}`,
 | 
					
						
							| 
									
										
										
										
											2016-06-08 08:29:13 +00:00
										 |  |  |       ``204 No Content``, ``205 Reset Content``, ``304 Not Modified``.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-10 23:16:21 -07:00
										 |  |  |       .. versionchanged:: 3.4
 | 
					
						
							|  |  |  |          The error response includes a Content-Length header.
 | 
					
						
							| 
									
										
										
										
											2013-03-16 22:23:30 +02:00
										 |  |  |          Added the *explain* argument.
 | 
					
						
							| 
									
										
										
										
											2013-03-15 07:53:21 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-17 13:00:36 +00:00
										 |  |  |    .. method:: send_response(code, message=None)
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-09 23:25:02 +08:00
										 |  |  |       Adds a response header to the headers buffer and logs the accepted
 | 
					
						
							| 
									
										
										
										
											2011-05-11 16:04:28 +08:00
										 |  |  |       request. The HTTP response line is written to the internal buffer,
 | 
					
						
							|  |  |  |       followed by *Server* and *Date* headers. The values for these two headers
 | 
					
						
							|  |  |  |       are picked up from the :meth:`version_string` and
 | 
					
						
							|  |  |  |       :meth:`date_time_string` methods, respectively. If the server does not
 | 
					
						
							|  |  |  |       intend to send any other headers using the :meth:`send_header` method,
 | 
					
						
							| 
									
										
										
										
											2015-11-02 03:37:02 +00:00
										 |  |  |       then :meth:`send_response` should be followed by an :meth:`end_headers`
 | 
					
						
							| 
									
										
										
										
											2011-05-12 01:10:57 +03:00
										 |  |  |       call.
 | 
					
						
							| 
									
										
										
										
											2011-05-11 16:04:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-12 01:10:57 +03:00
										 |  |  |       .. versionchanged:: 3.3
 | 
					
						
							|  |  |  |          Headers are stored to an internal buffer and :meth:`end_headers`
 | 
					
						
							|  |  |  |          needs to be called explicitly.
 | 
					
						
							| 
									
										
										
										
											2011-05-11 16:04:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. method:: send_header(keyword, value)
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-09 23:25:02 +08:00
										 |  |  |       Adds the HTTP header to an internal buffer which will be written to the
 | 
					
						
							| 
									
										
										
										
											2011-05-11 11:45:48 +08:00
										 |  |  |       output stream when either :meth:`end_headers` or :meth:`flush_headers` is
 | 
					
						
							|  |  |  |       invoked. *keyword* should specify the header keyword, with *value*
 | 
					
						
							|  |  |  |       specifying its value. Note that, after the send_header calls are done,
 | 
					
						
							|  |  |  |       :meth:`end_headers` MUST BE called in order to complete the operation.
 | 
					
						
							| 
									
										
										
										
											2010-11-21 14:36:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-24 22:48:30 +02:00
										 |  |  |       .. versionchanged:: 3.2
 | 
					
						
							|  |  |  |          Headers are stored in an internal buffer.
 | 
					
						
							| 
									
										
										
										
											2010-11-21 14:36:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-30 06:09:18 +00:00
										 |  |  |    .. method:: send_response_only(code, message=None)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-14 17:35:37 -07:00
										 |  |  |       Sends the response header only, used for the purposes when ``100
 | 
					
						
							| 
									
										
										
										
											2010-11-21 14:36:14 +00:00
										 |  |  |       Continue`` response is sent by the server to the client. The headers not
 | 
					
						
							|  |  |  |       buffered and sent directly the output stream.If the *message* is not
 | 
					
						
							|  |  |  |       specified, the HTTP message corresponding the response *code*  is sent.
 | 
					
						
							| 
									
										
										
										
											2010-09-30 06:09:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       .. versionadded:: 3.2
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. method:: end_headers()
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-09 23:25:02 +08:00
										 |  |  |       Adds a blank line
 | 
					
						
							|  |  |  |       (indicating the end of the HTTP headers in the response)
 | 
					
						
							| 
									
										
										
										
											2024-09-01 12:59:42 +08:00
										 |  |  |       to the headers buffer and calls :meth:`flush_headers`.
 | 
					
						
							| 
									
										
										
										
											2010-11-21 14:36:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-12 01:10:57 +03:00
										 |  |  |       .. versionchanged:: 3.2
 | 
					
						
							|  |  |  |          The buffered headers are written to the output stream.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-09 23:25:02 +08:00
										 |  |  |    .. method:: flush_headers()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Finally send the headers to the output stream and flush the internal
 | 
					
						
							|  |  |  |       headers buffer.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       .. versionadded:: 3.3
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-17 13:00:36 +00:00
										 |  |  |    .. method:: log_request(code='-', size='-')
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |       Logs an accepted (successful) request. *code* should specify the numeric
 | 
					
						
							|  |  |  |       HTTP code associated with the response. If a size of the response is
 | 
					
						
							|  |  |  |       available, then it should be passed as the *size* parameter.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. method:: log_error(...)
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |       Logs an error when a request cannot be fulfilled. By default, it passes
 | 
					
						
							|  |  |  |       the message to :meth:`log_message`, so it takes the same arguments
 | 
					
						
							|  |  |  |       (*format* and additional values).
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. method:: log_message(format, ...)
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |       Logs an arbitrary message to ``sys.stderr``. This is typically overridden
 | 
					
						
							|  |  |  |       to create custom error logging mechanisms. The *format* argument is a
 | 
					
						
							|  |  |  |       standard printf-style format string, where the additional arguments to
 | 
					
						
							|  |  |  |       :meth:`log_message` are applied as inputs to the formatting. The client
 | 
					
						
							| 
									
										
										
										
											2012-04-29 13:41:03 +08:00
										 |  |  |       ip address and current date and time are prefixed to every message logged.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. method:: version_string()
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |       Returns the server software's version string. This is a combination of the
 | 
					
						
							| 
									
										
										
										
											2016-04-24 01:51:02 +03:00
										 |  |  |       :attr:`server_version` and :attr:`sys_version` attributes.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-17 13:00:36 +00:00
										 |  |  |    .. method:: date_time_string(timestamp=None)
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-19 16:29:26 +03:00
										 |  |  |       Returns the date and time given by *timestamp* (which must be ``None`` or in
 | 
					
						
							| 
									
										
										
										
											2009-05-17 13:00:36 +00:00
										 |  |  |       the format returned by :func:`time.time`), formatted for a message
 | 
					
						
							|  |  |  |       header. If *timestamp* is omitted, it uses the current date and time.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |       The result looks like ``'Sun, 06 Nov 1994 08:49:37 GMT'``.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. method:: log_date_time_string()
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |       Returns the current date and time, formatted for logging.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. method:: address_string()
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-29 12:51:54 +08:00
										 |  |  |       Returns the client address.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       .. versionchanged:: 3.3
 | 
					
						
							|  |  |  |          Previously, a name lookup was performed. To avoid name resolution
 | 
					
						
							|  |  |  |          delays, it now always returns the IP address.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 09:29:06 +02:00
										 |  |  | .. class:: SimpleHTTPRequestHandler(request, client_address, server, directory=None)
 | 
					
						
							| 
									
										
										
										
											2008-05-26 16:32:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-11 03:26:53 +02:00
										 |  |  |    This class serves files from the directory *directory* and below,
 | 
					
						
							|  |  |  |    or the current directory if *directory* is not provided, directly
 | 
					
						
							| 
									
										
										
										
											2008-05-26 16:32:26 +00:00
										 |  |  |    mapping the directory structure to HTTP requests.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-22 22:40:26 +01:00
										 |  |  |    .. versionchanged:: 3.7
 | 
					
						
							|  |  |  |       Added the *directory* parameter.
 | 
					
						
							| 
									
										
										
										
											2021-05-11 03:26:53 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. versionchanged:: 3.9
 | 
					
						
							|  |  |  |       The *directory* parameter accepts a :term:`path-like object`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-26 16:32:26 +00:00
										 |  |  |    A lot of the work, such as parsing the request, is done by the base class
 | 
					
						
							|  |  |  |    :class:`BaseHTTPRequestHandler`.  This class implements the :func:`do_GET`
 | 
					
						
							|  |  |  |    and :func:`do_HEAD` functions.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The following are defined as class-level attributes of
 | 
					
						
							|  |  |  |    :class:`SimpleHTTPRequestHandler`:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. attribute:: server_version
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       This will be ``"SimpleHTTP/" + __version__``, where ``__version__`` is
 | 
					
						
							|  |  |  |       defined at the module level.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. attribute:: extensions_map
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-09 02:28:14 +08:00
										 |  |  |       A dictionary mapping suffixes into MIME types, contains custom overrides
 | 
					
						
							|  |  |  |       for the default system mappings. The mapping is used case-insensitively,
 | 
					
						
							| 
									
										
										
										
											2008-05-26 16:32:26 +00:00
										 |  |  |       and so should contain only lower-cased keys.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-09 02:28:14 +08:00
										 |  |  |       .. versionchanged:: 3.9
 | 
					
						
							|  |  |  |          This dictionary is no longer filled with the default system mappings,
 | 
					
						
							|  |  |  |          but only contains overrides.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-26 16:32:26 +00:00
										 |  |  |    The :class:`SimpleHTTPRequestHandler` class defines the following methods:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. method:: do_HEAD()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       This method serves the ``'HEAD'`` request type: it sends the headers it
 | 
					
						
							|  |  |  |       would send for the equivalent ``GET`` request. See the :meth:`do_GET`
 | 
					
						
							|  |  |  |       method for a more complete explanation of the possible headers.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. method:: 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 :meth:`list_directory` method. This method uses
 | 
					
						
							|  |  |  |       :func:`os.listdir` to scan the directory, and returns a ``404`` error
 | 
					
						
							| 
									
										
										
										
											2013-10-13 23:09:14 +03:00
										 |  |  |       response if the :func:`~os.listdir` fails.
 | 
					
						
							| 
									
										
										
										
											2008-05-26 16:32:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-02 12:26:12 +02:00
										 |  |  |       If the request was mapped to a file, it is opened. Any :exc:`OSError`
 | 
					
						
							|  |  |  |       exception in opening the requested file is mapped to a ``404``,
 | 
					
						
							| 
									
										
										
										
											2024-07-22 04:14:25 +03:00
										 |  |  |       ``'File not found'`` error. If there was an ``'If-Modified-Since'``
 | 
					
						
							| 
									
										
										
										
											2017-04-02 12:26:12 +02:00
										 |  |  |       header in the request, and the file was not modified after this time,
 | 
					
						
							|  |  |  |       a ``304``, ``'Not Modified'`` response is sent. Otherwise, the content
 | 
					
						
							| 
									
										
										
										
											2008-05-26 16:32:26 +00:00
										 |  |  |       type is guessed by calling the :meth:`guess_type` method, which in turn
 | 
					
						
							| 
									
										
										
										
											2017-04-02 12:26:12 +02:00
										 |  |  |       uses the *extensions_map* variable, and the file contents are returned.
 | 
					
						
							| 
									
										
										
										
											2008-05-26 16:32:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       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.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-08 05:46:23 +01:00
										 |  |  |       For example usage, see the implementation of the ``test`` function
 | 
					
						
							|  |  |  |       in :source:`Lib/http/server.py`.
 | 
					
						
							| 
									
										
										
										
											2008-05-26 16:32:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-02 12:26:12 +02:00
										 |  |  |       .. versionchanged:: 3.7
 | 
					
						
							|  |  |  |          Support of the ``'If-Modified-Since'`` header.
 | 
					
						
							| 
									
										
										
										
											2010-06-16 16:41:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-02 07:41:51 +00:00
										 |  |  | The :class:`SimpleHTTPRequestHandler` class can be used in the following
 | 
					
						
							|  |  |  | manner in order to create a very basic webserver serving files relative to
 | 
					
						
							| 
									
										
										
										
											2014-03-15 21:13:56 -07:00
										 |  |  | the current directory::
 | 
					
						
							| 
									
										
										
										
											2010-06-16 16:41:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-02 07:41:51 +00:00
										 |  |  |    import http.server
 | 
					
						
							|  |  |  |    import socketserver
 | 
					
						
							| 
									
										
										
										
											2010-06-16 16:41:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-02 07:41:51 +00:00
										 |  |  |    PORT = 8000
 | 
					
						
							| 
									
										
										
										
											2010-06-16 16:41:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-02 07:41:51 +00:00
										 |  |  |    Handler = http.server.SimpleHTTPRequestHandler
 | 
					
						
							| 
									
										
										
										
											2010-06-16 16:41:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-13 00:36:52 +00:00
										 |  |  |    with socketserver.TCPServer(("", PORT), Handler) as httpd:
 | 
					
						
							|  |  |  |        print("serving at port", PORT)
 | 
					
						
							|  |  |  |        httpd.serve_forever()
 | 
					
						
							| 
									
										
										
										
											2010-07-02 07:41:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-03 15:20:08 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | :class:`SimpleHTTPRequestHandler` can also be subclassed to enhance behavior,
 | 
					
						
							|  |  |  | such as using different index file names by overriding the class attribute
 | 
					
						
							|  |  |  | :attr:`index_pages`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-03 00:28:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-26 16:32:26 +00:00
										 |  |  | .. class:: CGIHTTPRequestHandler(request, client_address, server)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This class is used to serve either files or output of CGI scripts from the
 | 
					
						
							|  |  |  |    current directory and below. Note that mapping HTTP hierarchic structure to
 | 
					
						
							|  |  |  |    local directory structure is exactly as in :class:`SimpleHTTPRequestHandler`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       CGI scripts run by the :class:`CGIHTTPRequestHandler` class cannot execute
 | 
					
						
							|  |  |  |       redirects (HTTP code 302), because code 200 (script output follows) is
 | 
					
						
							|  |  |  |       sent prior to execution of the CGI script.  This pre-empts the status
 | 
					
						
							|  |  |  |       code.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The class will however, run the CGI script, instead of serving it as a file,
 | 
					
						
							|  |  |  |    if it guesses it to be a CGI script.  Only directory-based CGI are used ---
 | 
					
						
							|  |  |  |    the other common server configuration is to treat special extensions as
 | 
					
						
							|  |  |  |    denoting CGI scripts.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The :func:`do_GET` and :func:`do_HEAD` functions are modified to run CGI scripts
 | 
					
						
							|  |  |  |    and serve the output, instead of serving files, if the request leads to
 | 
					
						
							|  |  |  |    somewhere below the ``cgi_directories`` path.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The :class:`CGIHTTPRequestHandler` defines the following data member:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. attribute:: cgi_directories
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       This defaults to ``['/cgi-bin', '/htbin']`` and describes directories to
 | 
					
						
							|  |  |  |       treat as containing CGI scripts.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The :class:`CGIHTTPRequestHandler` defines the following method:
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-26 16:32:26 +00:00
										 |  |  |    .. method:: do_POST()
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-26 16:32:26 +00:00
										 |  |  |       This method serves the ``'POST'`` request type, only allowed for CGI
 | 
					
						
							|  |  |  |       scripts.  Error 501, "Can only POST to CGI scripts", is output when trying
 | 
					
						
							|  |  |  |       to POST to a non-CGI url.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-26 16:32:26 +00:00
										 |  |  |    Note that CGI scripts will be run with UID of user nobody, for security
 | 
					
						
							|  |  |  |    reasons.  Problems with the CGI script will be translated to error 403.
 | 
					
						
							| 
									
										
										
										
											2012-06-03 16:15:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-15 14:26:45 -07:00
										 |  |  |    .. deprecated-removed:: 3.13 3.15
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       :class:`CGIHTTPRequestHandler` is being removed in 3.15.  CGI has not
 | 
					
						
							|  |  |  |       been considered a good way to do things for well over a decade. This code
 | 
					
						
							|  |  |  |       has been unmaintained for a while now and sees very little practical use.
 | 
					
						
							|  |  |  |       Retaining it could lead to further :ref:`security considerations
 | 
					
						
							|  |  |  |       <http.server-security>`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-03 16:15:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-15 20:28:56 +04:00
										 |  |  | .. _http-server-cli:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Command-line interface
 | 
					
						
							|  |  |  | ----------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :mod:`http.server` can also be invoked directly using the :option:`-m`
 | 
					
						
							|  |  |  | switch of the interpreter.  The following example illustrates how to serve
 | 
					
						
							|  |  |  | files relative to the current directory::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    python -m http.server [OPTIONS] [port]
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The following options are accepted:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. program:: http.server
 | 
					
						
							| 
									
										
										
										
											2022-07-01 17:21:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-15 20:28:56 +04:00
										 |  |  | .. option:: port
 | 
					
						
							| 
									
										
										
										
											2023-09-15 14:26:45 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-15 20:28:56 +04:00
										 |  |  |    The server listens to port 8000 by default. The default can be overridden
 | 
					
						
							|  |  |  |    by passing the desired port number as an argument::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       python -m http.server 9000
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. option:: -b, --bind <address>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Specifies a specific address to which it should bind. Both IPv4 and IPv6
 | 
					
						
							|  |  |  |    addresses are supported. By default, the server binds itself to all
 | 
					
						
							|  |  |  |    interfaces. For example, the following command causes the server to bind
 | 
					
						
							|  |  |  |    to localhost only::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       python -m http.server --bind 127.0.0.1
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.4
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionchanged:: 3.8
 | 
					
						
							|  |  |  |       Support IPv6 in the ``--bind`` option.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. option:: -d, --directory <dir>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Specifies a directory to which it should serve the files. By default,
 | 
					
						
							|  |  |  |    the server uses the current directory. For example, the following command
 | 
					
						
							|  |  |  |    uses a specific directory::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       python -m http.server --directory /tmp/
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.7
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. option:: -p, --protocol <version>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Specifies the HTTP version to which the server is conformant. By default,
 | 
					
						
							|  |  |  |    the server is conformant to HTTP/1.0. For example, the following command
 | 
					
						
							|  |  |  |    runs an HTTP/1.1 conformant server::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       python -m http.server --protocol HTTP/1.1
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. option:: --cgi
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    :class:`CGIHTTPRequestHandler` can be enabled in the command line by passing
 | 
					
						
							|  |  |  |    the ``--cgi`` option::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       python -m http.server --cgi
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. deprecated-removed:: 3.13 3.15
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       :mod:`http.server` command line ``--cgi`` support is being removed
 | 
					
						
							|  |  |  |       because :class:`CGIHTTPRequestHandler` is being removed.
 | 
					
						
							| 
									
										
										
										
											2023-09-15 14:26:45 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-02 01:25:14 +08:00
										 |  |  | .. warning::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-15 20:28:56 +04:00
										 |  |  |    :class:`CGIHTTPRequestHandler` and the ``--cgi`` command-line option
 | 
					
						
							| 
									
										
										
										
											2024-03-02 01:25:14 +08:00
										 |  |  |    are not intended for use by untrusted clients and may be vulnerable
 | 
					
						
							|  |  |  |    to exploitation. Always use within a secure environment.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-15 20:28:56 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-01 17:21:27 +01:00
										 |  |  | .. _http.server-security:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-15 20:28:56 +04:00
										 |  |  | Security considerations
 | 
					
						
							| 
									
										
										
										
											2022-07-01 17:21:27 +01:00
										 |  |  | -----------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. index:: pair: http.server; security
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :class:`SimpleHTTPRequestHandler` will follow symbolic links when handling
 | 
					
						
							|  |  |  | requests, this makes it possible for files outside of the specified directory
 | 
					
						
							|  |  |  | to be served.
 | 
					
						
							| 
									
										
										
										
											2022-12-05 12:55:45 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Earlier versions of Python did not scrub control characters from the
 | 
					
						
							|  |  |  | log messages emitted to stderr from ``python -m http.server`` or the
 | 
					
						
							|  |  |  | default :class:`BaseHTTPRequestHandler` ``.log_message``
 | 
					
						
							| 
									
										
										
										
											2022-12-05 15:15:13 -08:00
										 |  |  | implementation. This could allow remote clients connecting to your
 | 
					
						
							| 
									
										
										
										
											2022-12-05 12:55:45 -08:00
										 |  |  | server to send nefarious control codes to your terminal.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-22 22:40:26 +01:00
										 |  |  | .. versionchanged:: 3.12
 | 
					
						
							| 
									
										
										
										
											2022-12-05 15:15:13 -08:00
										 |  |  |    Control characters are scrubbed in stderr logs.
 |