def _write_message(sock: ssl.SSLSocket, message: Any): class RequestEncoder(json.JSONEncoder): def default(self, o): return o.__dict__ message = json.dumps(message, cls=RequestEncoder).encode() sock.sendall(struct.pack(">Q", len(message))) sock.sendall(message)
def process(self, remote: ssl.SSLSocket): self.server.status = TUNNEL_PROCESSING logger.debug('Processing tunnel with ticket %s', self.server.ticket) # Process data until stop requested or connection closed try: while not self.server.stop_flag.is_set(): r, _w, _x = select.select([self.request, remote], [], [], 1.0) if self.request in r: data = self.request.recv(BUFFER_SIZE) if not data: break remote.sendall(data) if remote in r: data = remote.recv(BUFFER_SIZE) if not data: break self.request.sendall(data) logger.debug('Finished tunnel with ticekt %s', self.server.ticket) except Exception as e: pass