import os,select,socket,socketserver,signal,threading
signal.signal(signal.SIGTERM, lambda *_: exit(0))
class Proxy(socketserver.BaseRequestHandler):
    def handle(self):
        with socket.create_connection(self.server.upstream,timeout=15) as upstream:
            upstream.settimeout(None)
            while True:
                ready,_,_=select.select([self.request,upstream],[],[],300)
                if not ready: return
                for src in ready:
                    data=src.recv(65536)
                    if not data: return
                    (upstream if src is self.request else self.request).sendall(data)
class Server(socketserver.ThreadingTCPServer):
    allow_reuse_address=True
    daemon_threads=True
    def server_bind(self):
        self.socket.setsockopt(socket.SOL_IP,15,1)  # IP_FREEBIND: CI bridge may start later.
        super().server_bind()
for local,upstream in [(('127.0.0.1',8085),(os.environ['GITEA_IP'],8085)),(('10.90.240.1',3000),('127.0.0.1',3000))]:
    server=Server(local,Proxy); server.upstream=upstream
    threading.Thread(target=server.serve_forever,daemon=True).start()
signal.pause()
