44 lines
1.8 KiB
Python
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
|