import argparse
import socket
from urllib.error import HTTPError, URLError
from urllib.parse import urlparse
from urllib.request import Request, build_opener, ProxyHandler

parser = argparse.ArgumentParser()
parser.add_argument("--base", default="http://127.0.0.1:15721")
args = parser.parse_args()
url = urlparse(args.base)
if url.scheme != "http" or url.hostname not in {"127.0.0.1", "localhost", "::1"} or url.username or url.password:
    raise SystemExit("Only a credential-free local HTTP address is accepted")
port = url.port or 80
try:
    with socket.create_connection((url.hostname, port), timeout=3):
        print("TCP: listener reachable in this runtime")
except OSError as error:
    raise SystemExit("TCP: unavailable: " + str(error))
opener = build_opener(ProxyHandler({}))
try:
    response = opener.open(Request(args.base.rstrip("/") + "/", method="GET"), timeout=3)
    print("HTTP:", response.status)
except HTTPError as error:
    print("HTTP:", error.code, "(listener responded; root path may be undefined)")
except URLError as error:
    raise SystemExit("HTTP unavailable: " + str(error.reason))
print("No Key used, no model request sent. Reachability does not verify upstream authentication.")
