| 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)) |