diff options
author | Lisa Roach <lisaroach14@gmail.com> | 2018-11-26 18:43:38 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-26 18:43:38 (GMT) |
commit | 433433fa6d55091600ce88dd19206b3902e0a87d (patch) | |
tree | 568dab8c1adcc3e954f012b9b4ae13ac2f5578f6 | |
parent | 75e4699b31d1d88abad097ad13466c5c07711324 (diff) | |
download | cpython-433433fa6d55091600ce88dd19206b3902e0a87d.zip cpython-433433fa6d55091600ce88dd19206b3902e0a87d.tar.gz cpython-433433fa6d55091600ce88dd19206b3902e0a87d.tar.bz2 |
Adds IPv6 support when invoking http.server directly. (GH-10595)
-rw-r--r-- | Doc/library/http.server.rst | 8 | ||||
-rw-r--r-- | Lib/http/server.py | 3 | ||||
-rw-r--r-- | Lib/test/test_httpservers.py | 20 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2018-11-18-18-44-40.bpo-24209.p3YWOf.rst | 1 |
4 files changed, 30 insertions, 2 deletions
diff --git a/Doc/library/http.server.rst b/Doc/library/http.server.rst index 29f6e7d..a367e37 100644 --- a/Doc/library/http.server.rst +++ b/Doc/library/http.server.rst @@ -410,14 +410,18 @@ the previous example, this serves files relative to the current directory:: python -m http.server 8000 By default, server binds itself to all interfaces. The option ``-b/--bind`` -specifies a specific address to which it should bind. For example, the -following command causes the server to bind to localhost only:: +specifies a specific address to which it should bind. Both IPv4 and IPv6 +addresses are supported. For example, the following command causes the server +to bind to localhost only:: python -m http.server 8000 --bind 127.0.0.1 .. versionadded:: 3.4 ``--bind`` argument was introduced. +.. versionadded:: 3.8 + ``--bind`` argument enhanced to support IPv6 + By default, server uses the current directory. The option ``-d/--directory`` specifies a directory to which it should serve the files. For example, the following command uses a specific directory:: diff --git a/Lib/http/server.py b/Lib/http/server.py index ca2dd50..22d865f 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -1226,6 +1226,9 @@ def test(HandlerClass=BaseHTTPRequestHandler, """ server_address = (bind, port) + if ':' in bind: + ServerClass.address_family = socket.AF_INET6 + HandlerClass.protocol_version = protocol with ServerClass(server_address, HandlerClass) as httpd: sa = httpd.socket.getsockname() diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index cc829a5..3d8e0af 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -9,6 +9,7 @@ from http.server import BaseHTTPRequestHandler, HTTPServer, \ from http import server, HTTPStatus import os +import socket import sys import re import base64 @@ -1116,6 +1117,24 @@ class MiscTestCase(unittest.TestCase): self.assertCountEqual(server.__all__, expected) +class ScriptTestCase(unittest.TestCase): + @mock.patch('builtins.print') + def test_server_test_ipv6(self, _): + mock_server = mock.MagicMock() + server.test(ServerClass=mock_server, bind="::") + self.assertEqual(mock_server.address_family, socket.AF_INET6) + + mock_server.reset_mock() + server.test(ServerClass=mock_server, + bind="2001:0db8:85a3:0000:0000:8a2e:0370:7334") + self.assertEqual(mock_server.address_family, socket.AF_INET6) + + mock_server.reset_mock() + server.test(ServerClass=mock_server, + bind="::1") + self.assertEqual(mock_server.address_family, socket.AF_INET6) + + def test_main(verbose=None): cwd = os.getcwd() try: @@ -1127,6 +1146,7 @@ def test_main(verbose=None): CGIHTTPServerTestCase, SimpleHTTPRequestHandlerTestCase, MiscTestCase, + ScriptTestCase ) finally: os.chdir(cwd) diff --git a/Misc/NEWS.d/next/Library/2018-11-18-18-44-40.bpo-24209.p3YWOf.rst b/Misc/NEWS.d/next/Library/2018-11-18-18-44-40.bpo-24209.p3YWOf.rst new file mode 100644 index 0000000..88749e9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-11-18-18-44-40.bpo-24209.p3YWOf.rst @@ -0,0 +1 @@ +Adds IPv6 support when invoking http.server directly. |