From 8bcfa02e4b1b65634e526e197588bc600674c80b Mon Sep 17 00:00:00 2001 From: Julien Palard Date: Fri, 23 Mar 2018 17:40:33 +0100 Subject: [PATCH] bpo-31639: Use threads in http.server module. (GH-5018) --- Doc/library/http.server.rst | 11 +++++++++-- Lib/http/server.py | 9 +++++++-- .../Library/2017-12-27-21-55-19.bpo-31639.l3avDJ.rst | 2 ++ 3 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2017-12-27-21-55-19.bpo-31639.l3avDJ.rst diff --git a/Doc/library/http.server.rst b/Doc/library/http.server.rst index c98843de02c..4fe46cba691 100644 --- a/Doc/library/http.server.rst +++ b/Doc/library/http.server.rst @@ -33,9 +33,16 @@ handler. Code to create and run the server looks like this:: :attr:`server_port`. The server is accessible by the handler, typically through the handler's :attr:`server` instance variable. +.. class:: ThreadedHTTPServer(server_address, RequestHandlerClass) -The :class:`HTTPServer` must be given a *RequestHandlerClass* on instantiation, -of which this module provides three different variants: + This class is identical to HTTPServer but uses threads to handle + requests by using the :class:`~socketserver.ThreadingMixin`. This + is usefull to handle web browsers pre-opening sockets, on which + :class:`HTTPServer` would wait indefinitly. + +The :class:`HTTPServer` and :class:`ThreadedHTTPServer` must be given +a *RequestHandlerClass* on instantiation, of which this module +provides three different variants: .. class:: BaseHTTPRequestHandler(request, client_address, server) diff --git a/Lib/http/server.py b/Lib/http/server.py index 502bce0c7a4..a2726ab8975 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -83,7 +83,7 @@ XXX To do: __version__ = "0.6" __all__ = [ - "HTTPServer", "BaseHTTPRequestHandler", + "HTTPServer", "ThreadedHTTPServer", "BaseHTTPRequestHandler", "SimpleHTTPRequestHandler", "CGIHTTPRequestHandler", ] @@ -140,6 +140,10 @@ class HTTPServer(socketserver.TCPServer): self.server_port = port +class ThreadedHTTPServer(socketserver.ThreadingMixIn, HTTPServer): + daemon_threads = True + + class BaseHTTPRequestHandler(socketserver.StreamRequestHandler): """HTTP request handler base class. @@ -1213,7 +1217,8 @@ class CGIHTTPRequestHandler(SimpleHTTPRequestHandler): def test(HandlerClass=BaseHTTPRequestHandler, - ServerClass=HTTPServer, protocol="HTTP/1.0", port=8000, bind=""): + ServerClass=ThreadedHTTPServer, + protocol="HTTP/1.0", port=8000, bind=""): """Test the HTTP request handler class. This runs an HTTP server on port 8000 (or the port argument). diff --git a/Misc/NEWS.d/next/Library/2017-12-27-21-55-19.bpo-31639.l3avDJ.rst b/Misc/NEWS.d/next/Library/2017-12-27-21-55-19.bpo-31639.l3avDJ.rst new file mode 100644 index 00000000000..e876f40813d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-12-27-21-55-19.bpo-31639.l3avDJ.rst @@ -0,0 +1,2 @@ +http.server now exposes a ThreadedHTTPServer class and uses it when the +module is invoked to cope with web browsers pre-opening sockets.