Files
lexgo/spikes/selection/serve.py

44 lines
1.8 KiB
Python

"""Serve only the fictional reading experiment; default is loopback."""
import argparse
import ipaddress
from http.server import BaseHTTPRequestHandler, HTTPServer
from pathlib import Path
ROOT = Path(__file__).resolve().parent
FILES = {'/': ('index.html', 'text/html'), '/style.css': ('style.css', 'text/css'),
'/app.mjs': ('app.mjs', 'text/javascript'), '/range.mjs': ('range.mjs', 'text/javascript'),
'/fixtures.mjs': ('fixtures.mjs', 'text/javascript')}
class Handler(BaseHTTPRequestHandler):
timeout = 10
def log_message(self, *_args):
pass
def do_GET(self):
item = FILES.get(self.path)
data = (ROOT / item[0]).read_bytes() if item else b'Not found'
self.send_response(200 if item else 404)
self.send_header('Content-Type', (item[1] if item else 'text/plain') + '; charset=utf-8')
self.send_header('Content-Length', str(len(data)))
self.send_header('Cache-Control', 'no-store')
self.send_header('X-Content-Type-Options', 'nosniff')
self.send_header('Content-Security-Policy', "default-src 'self'; script-src 'self'; style-src 'self'; connect-src 'none'; frame-ancestors 'none'; base-uri 'none'")
self.end_headers()
self.wfile.write(data)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--host', default='127.0.0.1', help='Numeric local address; LAN testing is opt-in')
parser.add_argument('--port', type=int, default=5184)
args = parser.parse_args()
ipaddress.IPv4Address(args.host)
with HTTPServer((args.host, args.port), Handler) as server:
print(f'LexGo selection experiment: http://{args.host}:{server.server_port}/', flush=True)
try:
server.serve_forever()
except KeyboardInterrupt:
pass