| 
						
						
							
								
							
						
						
					 | 
					@ -319,7 +319,7 @@ class TCPRelayHandler(object): | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					                        traceback.print_exc() | 
					 | 
					 | 
					                        traceback.print_exc() | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					                    self.destroy() | 
					 | 
					 | 
					                    self.destroy() | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    def _handle_stage_addr(self, data): | 
					 | 
					 | 
					    def _handle_stage_addr(self, ogn_data, data): | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					        try: | 
					 | 
					 | 
					        try: | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            if self._is_local: | 
					 | 
					 | 
					            if self._is_local: | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					                cmd = common.ord(data[1]) | 
					 | 
					 | 
					                cmd = common.ord(data[1]) | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					@ -345,13 +345,18 @@ class TCPRelayHandler(object): | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					                    logging.error('unknown command %d', cmd) | 
					 | 
					 | 
					                    logging.error('unknown command %d', cmd) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					                    self.destroy() | 
					 | 
					 | 
					                    self.destroy() | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					                    return | 
					 | 
					 | 
					                    return | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					            before_parse_data = data | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            if FORCE_NEW_PROTOCOL and ord(data[0]) != 0x88: | 
					 | 
					 | 
					            if FORCE_NEW_PROTOCOL and ord(data[0]) != 0x88: | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                logging.warn("TCP data %s decrypt %s" % (binascii.hexlify(ogn_data), binascii.hexlify(before_parse_data))) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					                raise Exception('can not parse header') | 
					 | 
					 | 
					                raise Exception('can not parse header') | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            data = pre_parse_header(data) | 
					 | 
					 | 
					            data = pre_parse_header(data) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            if data is None: | 
					 | 
					 | 
					            if data is None: | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                logging.warn("TCP data %s decrypt %s" % (binascii.hexlify(ogn_data), binascii.hexlify(before_parse_data))) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					                raise Exception('can not parse header') | 
					 | 
					 | 
					                raise Exception('can not parse header') | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            header_result = parse_header(data) | 
					 | 
					 | 
					            header_result = parse_header(data) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            if header_result is None: | 
					 | 
					 | 
					            if header_result is None: | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                logging.warn("TCP data %s decrypt %s" % (binascii.hexlify(ogn_data), binascii.hexlify(before_parse_data))) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					                raise Exception('can not parse header') | 
					 | 
					 | 
					                raise Exception('can not parse header') | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            connecttype, remote_addr, remote_port, header_length = header_result | 
					 | 
					 | 
					            connecttype, remote_addr, remote_port, header_length = header_result | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            logging.info('%s connecting %s:%d from %s:%d' % | 
					 | 
					 | 
					            logging.info('%s connecting %s:%d from %s:%d' % | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -497,6 +502,7 @@ class TCPRelayHandler(object): | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        if not data: | 
					 | 
					 | 
					        if not data: | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            self.destroy() | 
					 | 
					 | 
					            self.destroy() | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            return | 
					 | 
					 | 
					            return | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        ogn_data = data | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        self._update_activity(len(data)) | 
					 | 
					 | 
					        self._update_activity(len(data)) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        if not is_local: | 
					 | 
					 | 
					        if not is_local: | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            data = self._encryptor.decrypt(data) | 
					 | 
					 | 
					            data = self._encryptor.decrypt(data) | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					@ -517,7 +523,7 @@ class TCPRelayHandler(object): | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            self._handle_stage_connecting(data) | 
					 | 
					 | 
					            self._handle_stage_connecting(data) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        elif (is_local and self._stage == STAGE_ADDR) or \ | 
					 | 
					 | 
					        elif (is_local and self._stage == STAGE_ADDR) or \ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					                (not is_local and self._stage == STAGE_INIT): | 
					 | 
					 | 
					                (not is_local and self._stage == STAGE_INIT): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					            self._handle_stage_addr(data) | 
					 | 
					 | 
					            self._handle_stage_addr(ogn_data, data) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    def _on_remote_read(self, is_remote_sock): | 
					 | 
					 | 
					    def _on_remote_read(self, is_remote_sock): | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        # handle all remote read events | 
					 | 
					 | 
					        # handle all remote read events | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					
  |