blob: 1f4fae86dedb5915c3a207cb166acd264c660da5 [file] [log] [blame]
import contextlib
import errno
import os
import sys
import time
from http import server
def main(argv):
build_workspace_directory = os.environ["BUILD_WORKSPACE_DIRECTORY"]
docs_directory = argv[1]
serve_directory = os.path.join(build_workspace_directory, docs_directory)
class DirectoryHandler(server.SimpleHTTPRequestHandler):
def __init__(self, *args, **kwargs):
super().__init__(directory=serve_directory, *args, **kwargs)
address = ("0.0.0.0", 8000)
# with server.ThreadingHTTPServer(address, DirectoryHandler) as (ip, port, httpd):
with _start_server(DirectoryHandler, "0.0.0.0", 8000) as (ip, port, httpd):
def _print_server_info():
print(f"Serving...")
print(f" Address: http://{ip}:{port}")
print(f" Serving directory: {serve_directory}")
print(f" url: file://{serve_directory}")
print(f" Server CWD: {os.getcwd()}")
print()
print("*** You do not need to restart this server to see changes ***")
print("*** CTRL+C once to reprint this info ***")
print("*** CTRL+C twice to exit ***")
print()
while True:
_print_server_info()
try:
httpd.serve_forever()
except KeyboardInterrupt:
_print_server_info()
print(
"*** KeyboardInterrupt received: CTRL+C again to terminate server ***"
)
try:
time.sleep(1)
print("Restarting serving ...")
except KeyboardInterrupt:
break
return 0
@contextlib.contextmanager
def _start_server(handler, ip, start_port):
for port in range(start_port, start_port + 10):
try:
with server.ThreadingHTTPServer((ip, port), handler) as httpd:
yield ip, port, httpd
return
except OSError as e:
if e.errno == errno.EADDRINUSE:
pass
else:
raise
raise ValueError("Unable to find an available port")
if __name__ == "__main__":
sys.exit(main(sys.argv))