diff options
author | Jason R. Coombs <jaraco@jaraco.com> | 2019-02-07 13:22:45 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-07 13:22:45 (GMT) |
commit | f289084c83190cc72db4a70c58f007ec62e75247 (patch) | |
tree | 6fe7fe86d58952d6eb337add411c7da5ea53fc86 /Lib/http | |
parent | 2848d9d29914948621bce26bf0d9a89f2e19b97b (diff) | |
download | cpython-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.py | 30 |
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(), |