#!/usr/bin/env python3
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
import ssl
import sys
import urllib.error
import urllib.request

UPSTREAM = "https://soft.lnmp.com"


class ProxyHandler(BaseHTTPRequestHandler):
    def do_HEAD(self):
        self._proxy(head_only=True)

    def do_GET(self):
        self._proxy(head_only=False)

    def log_message(self, fmt, *args):
        sys.stderr.write("%s - - [%s] %s\n" % (self.client_address[0], self.log_date_time_string(), fmt % args))

    def _proxy(self, head_only):
        target = UPSTREAM + self.path
        req = urllib.request.Request(target, method="HEAD" if head_only else "GET")
        req.add_header("User-Agent", "Codex-LNMP-Mirror-Proxy/1.0")
        context = ssl.create_default_context()
        try:
            with urllib.request.urlopen(req, timeout=60, context=context) as resp:
                self.send_response(resp.status)
                for key, value in resp.headers.items():
                    if key.lower() in {"transfer-encoding", "connection", "content-encoding"}:
                        continue
                    self.send_header(key, value)
                self.end_headers()
                if not head_only:
                    while True:
                        chunk = resp.read(1024 * 256)
                        if not chunk:
                            break
                        self.wfile.write(chunk)
        except urllib.error.HTTPError as exc:
            self.send_response(exc.code)
            self.end_headers()
            self.wfile.write(str(exc).encode())
        except Exception as exc:
            self.send_response(502)
            self.end_headers()
            self.wfile.write(str(exc).encode())


if __name__ == "__main__":
    port = int(sys.argv[1]) if len(sys.argv) > 1 else 18080
    server = ThreadingHTTPServer(("127.0.0.1", port), ProxyHandler)
    print(f"LNMP mirror proxy listening on 127.0.0.1:{port}, upstream={UPSTREAM}", flush=True)
    server.serve_forever()
