| #!/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, | 
 |     ) |