blob: a0732735ed717864f1de1afcd8526b2b48165555 [file] [log] [blame]
#!/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,
)