#!/usr/bin/python
from OpenSSL import crypto
import http.server
import json
import os
import re
import ssl
import sys
import time
if len(sys.argv) >= 2:
# chdir if invoked through meson; assume that we're in the correct dir already otherwise
(
script,
build_root,
) = sys.argv
os.chdir(build_root)
HTTP_HOST = '127.0.0.1'
HTTP_PORT = 8000
HTTP_INDEX = 'serve-wasm.index.html'
KEY_FILE = 'serve-wasm.key.pem'
CERT_FILE = 'serve-wasm.cert.crt'
CERT_CN = 'serve-wasm.py self-signed certificate for @APP_EXE@.js'
CERT_TTL = 30 * 24 * 60 * 60
print(f'generating index for @APP_EXE@.js')
with open(HTTP_INDEX, 'wt') as f:
f.write(f'''
Remember, this is being served locally, so it will not be able to connect to @SERVER@. To enable this, serve the following files there:
- @APP_EXE@.js
- @APP_EXE@.wasm
- @APP_EXE@.wasm.map for debugging purposes
Loading...
''')
def remove_if_too_old(path):
if os.path.isfile(path):
diff = time.time() - os.path.getmtime(path)
if diff > CERT_TTL / 2:
os.remove(path)
remove_if_too_old(CERT_FILE)
remove_if_too_old(KEY_FILE)
if not (os.path.isfile(CERT_FILE) and os.path.isfile(KEY_FILE)):
print('generating keypair')
key = crypto.PKey()
key.generate_key(crypto.TYPE_RSA, 2048)
cert = crypto.X509()
cert.get_subject().CN = CERT_CN
cert.set_serial_number(int(time.time()))
cert.gmtime_adj_notBefore(0)
cert.gmtime_adj_notAfter(CERT_TTL)
cert.set_issuer(cert.get_subject())
cert.set_pubkey(key)
cert.sign(key, 'sha256')
with open(CERT_FILE, 'wt') as f:
f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert).decode('utf-8'))
with open(KEY_FILE, 'wt') as f:
f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, key).decode('utf-8'))
class MyHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
index_pages = (HTTP_INDEX, )
def end_headers(self):
print(self.index_pages)
self.send_my_headers()
http.server.SimpleHTTPRequestHandler.end_headers(self)
def send_my_headers(self):
self.send_header('Cross-Origin-Opener-Policy', 'same-origin')
self.send_header('Cross-Origin-Embedder-Policy', 'require-corp')
server_address = (HTTP_HOST, HTTP_PORT)
httpd = http.server.HTTPServer(server_address, MyHTTPRequestHandler)
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ssl_context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)
httpd.socket = ssl_context.wrap_socket(httpd.socket, server_side=True)
print(f'serving at https://{HTTP_HOST}:{HTTP_PORT}, Ctrl+C to exit')
httpd.serve_forever()