| #!/usr/bin/env python3 | |
| # Copyright 2022 The IREE Authors | |
| # | |
| # Licensed under the Apache License v2.0 with LLVM Exceptions. | |
| # See https://llvm.org/LICENSE.txt for license information. | |
| # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| """Local server for development, with support for CORS headers and MIME types. | |
| NOTE: This is NOT suitable for production serving, it is just a slightly | |
| extended version of https://docs.python.org/3/library/http.server.html. | |
| Usage: | |
| python3 local_server.py --directory {build_dir} | |
| (then open http://localhost:8000/ in your browser) | |
| """ | |
| import os | |
| from functools import partial | |
| from http import server | |
| class CORSHTTPRequestHandler(server.SimpleHTTPRequestHandler): | |
| def __init__(self, *args, **kwargs): | |
| # Include MIME types for files we expect to be serving. | |
| # https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types | |
| self.extensions_map.update( | |
| { | |
| ".js": "application/javascript", | |
| ".wasm": "application/wasm", | |
| } | |
| ) | |
| super().__init__(*args, **kwargs) | |
| # Inspiration for this hack: https://stackoverflow.com/a/13354482 | |
| def end_headers(self): | |
| self.send_cors_headers() | |
| server.SimpleHTTPRequestHandler.end_headers(self) | |
| def send_cors_headers(self): | |
| # Emscripten uses SharedArrayBuffer for its multithreading, which requires | |
| # Cross Origin Opener Policy and Cross Origin Embedder Policy headers: | |
| # * https://emscripten.org/docs/porting/pthreads.html | |
| # * https://developer.chrome.com/blog/enabling-shared-array-buffer/ | |
| self.send_header("Cross-Origin-Embedder-Policy", "require-corp") | |
| self.send_header("Cross-Origin-Opener-Policy", "same-origin") | |
| if __name__ == "__main__": | |
| import argparse | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument( | |
| "--directory", | |
| "-d", | |
| default=os.getcwd(), | |
| help="Specify alternative directory " "[default:current directory]", | |
| ) | |
| parser.add_argument( | |
| "port", | |
| action="store", | |
| default=8000, | |
| type=int, | |
| nargs="?", | |
| help="Specify alternate port [default: 8000]", | |
| ) | |
| args = parser.parse_args() | |
| server.test( | |
| HandlerClass=partial(CORSHTTPRequestHandler, directory=args.directory), | |
| port=args.port, | |
| ) |