"""Static server for local checks, plus POST /capture to save a canvas frame. The browser can render a WebGL scene but cannot hand the pixels back to this machine, and its downloads land somewhere unreachable. So the page posts the data URL here and the frame lands on disk, where it can actually be looked at. python dev_server.py [port] fetch('/capture', {method:'POST', body: canvas.toDataURL('image/jpeg', 0.6)}) """ import base64 import os import sys from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer ROOT = os.path.dirname(os.path.abspath(__file__)) OUT = os.path.join(ROOT, "captures") class Handler(SimpleHTTPRequestHandler): def do_POST(self): if self.path.split("?")[0] != "/capture": self.send_error(404) return length = int(self.headers.get("Content-Length", 0)) body = self.rfile.read(length).decode("utf-8", "replace") header, _, payload = body.partition(",") ext = "png" if "png" in header else "jpg" name = self.headers.get("X-Name") or "capture" os.makedirs(OUT, exist_ok=True) path = os.path.join(OUT, f"{name}.{ext}") with open(path, "wb") as f: f.write(base64.b64decode(payload)) print(f"[capture] {path} ({os.path.getsize(path)} bytes)", flush=True) self.send_response(200) self.send_header("Content-Type", "text/plain") self.end_headers() self.wfile.write(path.encode()) def end_headers(self): self.send_header("Cache-Control", "no-store") super().end_headers() def log_message(self, *args): pass if __name__ == "__main__": port = int(sys.argv[1]) if len(sys.argv) > 1 else 8140 os.chdir(ROOT) print(f"serving {ROOT} on http://127.0.0.1:{port}", flush=True) ThreadingHTTPServer(("127.0.0.1", port), Handler).serve_forever()