import socket, threading, http.server

class ReverseProxy(http.server.BaseHTTPRequestHandler):
    target = ("127.0.0.1", 3412)
    protocol_version = "HTTP/1.1"

    def _proxy(self):
        method = self.command
        path = self.path
        body = None
        cl = self.headers.get("Content-Length")
        if cl:
            body = self.rfile.read(int(cl))
        s = socket.create_connection(self.target, timeout=15)
        lines = [f"{method} {path} HTTP/1.1",
                 f"Host: 127.0.0.1:3412",
                 "Connection: close"]
        for k, v in self.headers.items():
            if k.lower() in ("host", "connection"):
                continue
            lines.append(f"{k}: {v}")
        req = ("\r\n".join(lines) + "\r\n\r\n").encode()
        if body:
            req += body
        s.sendall(req)
        resp = b""
        try:
            while True:
                chunk = s.recv(65536)
                if not chunk:
                    break
                resp += chunk
        except socket.timeout:
            pass
        s.close()
        head, _, rest = resp.partition(b"\r\n\r\n")
        status_line = head.split(b"\r\n")[0]
        parts = status_line.split(b" ", 2)
        code = int(parts[1])
        msg = parts[2].decode("latin-1") if len(parts) > 2 else ""
        self.send_response(code, msg)
        for line in head.split(b"\r\n")[1:]:
            k, _, v = line.partition(b":")
            k, v = k.decode("latin-1").strip(), v.decode("latin-1").strip()
            if k.lower() in ("transfer-encoding", "connection"):
                continue
            self.send_header(k, v)
        self.send_header("Content-Length", str(len(rest)))
        self.end_headers()
        self.wfile.write(rest)

    def do_GET(self): self._proxy()
    def do_POST(self): self._proxy()
    def do_HEAD(self): self._proxy()

    def log_message(self, *a): pass

# bind ONLY to Tailscale IP so VPS can reach it without firewall prompts
srv = http.server.ThreadingHTTPServer(("100.81.171.105", 3413), ReverseProxy)
print("proxy 100.81.171.105:3413 -> 127.0.0.1:3412", flush=True)
srv.serve_forever()
