import socket, threading, sys, select
port = int(sys.argv[1])
def handle(c):
    req = b""
    while b"\r\n\r\n" not in req:
        d = c.recv(4096)
        if not d: return
        req += d
    line = req.split(b"\r\n")[0].decode()
    print("PROXY RECEIVED:", line, flush=True)
    if line.startswith("CONNECT"):
        host, p = line.split()[1].rsplit(":", 1)
        u = socket.create_connection((host, int(p)))
        c.sendall(b"HTTP/1.1 200 Connection established\r\n\r\n")
        socks = [c, u]
        while True:
            r, _, _ = select.select(socks, [], [], 30)
            if not r: break
            for s in r:
                d = s.recv(65536)
                if not d: return
                (u if s is c else c).sendall(d)
s = socket.socket(); s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1); s.bind(("127.0.0.1", port)); s.listen()
while True:
    c, _ = s.accept(); threading.Thread(target=handle, args=(c,), daemon=True).start()
