#!/usr/bin/env python3
"""
Serves the POC on 127.0.0.1:8080.

Paths under /gen/ are served from the Chromium build's generated-JS
directory so the attacker frame can load the MojoJS bindings (the
device_posture_provider.mojom.m.js module and its bindings.js dependency).
Everything else is served from the directory containing this script.
"""
import http.server
import os
import socketserver
import sys

PORT = int(os.environ.get("POC_PORT", "28080"))
HERE = os.path.dirname(os.path.abspath(__file__))
GEN_DIR = os.environ.get(
    "CHROMIUM_GEN_DIR", "/chromium/chromium/src/out/asan/gen")


class Handler(http.server.SimpleHTTPRequestHandler):
    extensions_map = dict(http.server.SimpleHTTPRequestHandler.extensions_map)
    extensions_map[".js"] = "text/javascript"

    def translate_path(self, path):
        clean = path.split("?", 1)[0].split("#", 1)[0]
        if clean.startswith("/gen/"):
            rel = os.path.normpath(clean[len("/gen/"):]).lstrip(os.sep)
            return os.path.join(GEN_DIR, rel)
        rel = os.path.normpath(clean).lstrip(os.sep)
        return os.path.join(HERE, rel)

    def end_headers(self):
        self.send_header("Cache-Control", "no-store")
        super().end_headers()


class ReusableTCPServer(socketserver.TCPServer):
    allow_reuse_address = True


if __name__ == "__main__":
    if not os.path.isdir(GEN_DIR):
        sys.stderr.write(
            "warning: CHROMIUM_GEN_DIR=%r not found; set it to "
            "<chromium>/out/<build>/gen\n" % GEN_DIR)
    with ReusableTCPServer(("127.0.0.1", PORT), Handler) as httpd:
        sys.stderr.write("serving on http://127.0.0.1:%d/\n" % PORT)
        httpd.serve_forever()
