def on_command(self, cmd): print 'command:', repr(cmd) try: parse_request_addr(cmd) except Exception as e: print e self.destroy() else: self.send('\x05\x00\x00\x01' + '\x00' * 6, self.local_sock) print 'granted', self.local_addr self.cmd = cmd sock = socket.socket() self.remote_sock = sock sock.setblocking(0) sock2handler[sock] = self ws.add(sock) self.state = STATE_CONNECTING sock.connect_ex(config.server)
def on_read(self, sock): try: data = sock.recv(BUF_SIZE) except Exception as e: print e self.destroy() return if not data: self.destroy() return if self.stage == STAGE_RELAYING: if sock == self.local_sock: data = decrypt(data) print '->', len(data) self.send(data, self.remote_sock) elif sock == self.remote_sock: print '<-', len(data) data = encrypt(data) self.send(data, self.local_sock) elif self.stage == STAGE_WAIT_COMMAND: cmd = decrypt(data) try: request_addr = parse_request_addr(cmd) self.send(encrypt('\x05\x00'), self.local_sock) sock = socket.socket() self.remote_sock = sock sock.setblocking(0) ws.add(sock) sock2handler[sock] = self sock.connect_ex(request_addr) self.stage = STAGE_CONNECTING print 'connecting to remote', request_addr except Exception as e: print e self.destroy() elif self.stage == STAGE_CONNECTING: data = decrypt(data) self.data_to_remote.append(data)