summaryrefslogtreecommitdiffstats
path: root/Lib/http
diff options
context:
space:
mode:
authorJason R. Coombs <jaraco@jaraco.com>2019-02-07 13:22:45 (GMT)
committerGitHub <noreply@github.com>2019-02-07 13:22:45 (GMT)
commitf289084c83190cc72db4a70c58f007ec62e75247 (patch)
tree6fe7fe86d58952d6eb337add411c7da5ea53fc86 /Lib/http
parent2848d9d29914948621bce26bf0d9a89f2e19b97b (diff)
downloadcpython-f289084c83190cc72db4a70c58f007ec62e75247.zip
cpython-f289084c83190cc72db4a70c58f007ec62e75247.tar.gz
cpython-f289084c83190cc72db4a70c58f007ec62e75247.tar.bz2
bpo-24209: In http.server script, rely on getaddrinfo to bind to preferred address based on the bind parameter. (#11767)
In http.server script, rely on getaddrinfo to bind to preferred address based on the bind parameter. As a result, now IPv6 is used as the default (including IPv4 on dual-stack systems). Enhanced tests.
Diffstat (limited to 'Lib/http')
-rw-r--r--Lib/http/server.py30
1 files changed, 20 insertions, 10 deletions
diff --git a/Lib/http/server.py b/Lib/http/server.py
index 29c720e..b247675 100644
--- a/Lib/http/server.py
+++ b/Lib/http/server.py
@@ -1224,24 +1224,34 @@ class CGIHTTPRequestHandler(SimpleHTTPRequestHandler):
self.log_message("CGI script exited OK")
+def _get_best_family(*address):
+ infos = socket.getaddrinfo(
+ *address,
+ type=socket.SOCK_STREAM,
+ flags=socket.AI_PASSIVE,
+ )
+ family, type, proto, canonname, sockaddr = next(iter(infos))
+ return family, sockaddr
+
+
def test(HandlerClass=BaseHTTPRequestHandler,
ServerClass=ThreadingHTTPServer,
- protocol="HTTP/1.0", port=8000, bind=""):
+ protocol="HTTP/1.0", port=8000, bind=None):
"""Test the HTTP request handler class.
This runs an HTTP server on port 8000 (or the port argument).
"""
- server_address = (bind, port)
-
- if ':' in bind:
- ServerClass.address_family = socket.AF_INET6
+ ServerClass.address_family, addr = _get_best_family(bind, port)
HandlerClass.protocol_version = protocol
- with ServerClass(server_address, HandlerClass) as httpd:
- sa = httpd.socket.getsockname()
- serve_message = "Serving HTTP on {host} port {port} (http://{host}:{port}/) ..."
- print(serve_message.format(host=sa[0], port=sa[1]))
+ with ServerClass(addr, HandlerClass) as httpd:
+ host, port = httpd.socket.getsockname()[:2]
+ url_host = f'[{host}]' if ':' in host else host
+ print(
+ f"Serving HTTP on {host} port {port} "
+ f"(http://{url_host}:{port}/) ..."
+ )
try:
httpd.serve_forever()
except KeyboardInterrupt:
@@ -1254,7 +1264,7 @@ if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--cgi', action='store_true',
help='Run as CGI Server')
- parser.add_argument('--bind', '-b', default='', metavar='ADDRESS',
+ parser.add_argument('--bind', '-b', metavar='ADDRESS',
help='Specify alternate bind address '
'[default: all interfaces]')
parser.add_argument('--directory', '-d', default=os.getcwd(),