blob: 835a7600d0214f52b22a2f5b7160334546b9d009 [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)