import socket, threading, select, sys

def handle(client):
    try:
        req = b""
        while b"\r\n\r\n" not in req:
            d = client.recv(4096)
            if not d: return
            req += d
        first = req.split(b"\r\n")[0].decode()
        parts = first.split(" ", 2)
        if len(parts) < 2: return
        method = parts[0]
        if method == "CONNECT":
            host, port = parts[1].rsplit(":", 1)
            port = int(port)
            srv = socket.create_connection((host, port), timeout=30)
            client.sendall(b"HTTP/1.1 200 Connection established\r\n\r\n")
            for s in [client, srv]:
                s.setblocking(False)
            while True:
                r, _, _ = select.select([client, srv], [], [], 60)
                if not r: break
                for s in r:
                    d = s.recv(65536)
                    if not d: return
                    (srv if s is client else client).sendall(d)
        else:
            client.sendall(b"HTTP/1.1 405 Method Not Allowed\r\n\r\n")
    except: pass
    finally:
        try: client.close()
        except: pass

srv = socket.socket()
srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
srv.bind(("0.0.0.0", 3129))
srv.listen(50)
print("FRIP eCourts proxy running on port 3129", flush=True)
while True:
    c, _ = srv.accept()
    threading.Thread(target=handle, args=(c,), daemon=True).start()
