diff options
author | Julien Palard <julien@palard.fr> | 2018-03-23 16:40:33 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-03-23 16:40:33 (GMT) |
commit | 8bcfa02e4b1b65634e526e197588bc600674c80b (patch) | |
tree | 78f5c33e9f31babbc38a317203be86cb7a8eb6ed | |
parent | a0a42d22d8dff0ec6ea9daa4d9c9e9399f9b4e6c (diff) | |
download | cpython-8bcfa02e4b1b65634e526e197588bc600674c80b.zip cpython-8bcfa02e4b1b65634e526e197588bc600674c80b.tar.gz cpython-8bcfa02e4b1b65634e526e197588bc600674c80b.tar.bz2 |
bpo-31639: Use threads in http.server module. (GH-5018)
-rw-r--r-- | Doc/library/http.server.rst | 11 | ||||
-rw-r--r-- | Lib/http/server.py | 9 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2017-12-27-21-55-19.bpo-31639.l3avDJ.rst | 2 |
3 files changed, 18 insertions, 4 deletions
diff --git a/Doc/library/http.server.rst b/Doc/library/http.server.rst index c98843de..4fe46cb 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 502bce0..a2726ab 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 0000000..e876f40 --- /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. |