#!/usr/bin/env python3
"""
Static file server for the SerialPortImpl use-after-unmap POC.

Serves poc.html plus the auto-generated MojoJS bindings from the Chromium
output directory under /gen/, so the HTML can load:
  /gen/mojo/public/js/mojo_bindings_lite.js
  /gen/services/device/public/mojom/serial.mojom-lite.js
  /gen/third_party/blink/public/mojom/serial/serial.mojom-lite.js
  ... and dependency mojom-lite.js files.
"""

import http.server
import os
import socketserver
import sys

PORT = 8080
HERE = os.path.dirname(os.path.abspath(__file__))

# Adjust if your build dir differs.
GEN_DIR = os.environ.get(
    "CHROMIUM_GEN_DIR",
    "/chromium/chromium/src/out/asan/gen",
)


class Handler(http.server.SimpleHTTPRequestHandler):
    def translate_path(self, path):  # noqa: D401
        # Route /gen/* into the Chromium build's gen/ directory so the
        # POC can fetch generated *.mojom-lite.js bindings.
        clean = path.split("?", 1)[0].split("#", 1)[0]
        if clean.startswith("/gen/"):
            rel = clean[len("/gen/"):]
            # Prevent path traversal.
            rel = os.path.normpath(rel).lstrip(os.sep)
            return os.path.join(GEN_DIR, rel)
        # Everything else comes from the artifacts directory.
        return os.path.join(HERE, clean.lstrip("/"))

    def end_headers(self):
        # MojoJS bindings are JS but the .js extension already gives the
        # right MIME type via SimpleHTTPRequestHandler.
        self.send_header("Cache-Control", "no-store")
        super().end_headers()

    def log_message(self, fmt, *args):
        sys.stderr.write("[server] " + (fmt % args) + "\n")


def main():
    if not os.path.isdir(GEN_DIR):
        sys.stderr.write(
            f"[!] WARNING: gen dir not found: {GEN_DIR}\n"
            f"    Set CHROMIUM_GEN_DIR or build with `autoninja -C out/asan chrome`.\n"
        )
    socketserver.TCPServer.allow_reuse_address = True
    with socketserver.TCPServer(("127.0.0.1", PORT), Handler) as httpd:
        sys.stderr.write(f"[*] Serving on http://127.0.0.1:{PORT}/poc.html\n")
        sys.stderr.write(f"[*] /gen/ -> {GEN_DIR}\n")
        httpd.serve_forever()


if __name__ == "__main__":
    main()
