Example #1
0
	def recv_data(self, response_type):
		log.debug('receiving data...')
		total_data = ''
		while True:
			data = None
			try:
				data = self.__socket.recv(SIZE)
				
				if not data:
					log.debug('no more data in socket')
					break
					
				log.debug('read chunk %d bytes' % len(data))
				total_data += data
				if response_type:
					try:
						decoded_packet = packet.decode_answer(total_data, response_type)
						log.debug('whole data packet was received.')
						return decoded_packet
					except Exception, ex:
						continue
				
			except socket.error, err:
				#EAGAIN & EWOULDBLOCK
				if err.errno != 11:
					raise err
				elif total_data and not response_type:
					try:
						service_name, method_name, request_inst, response_class = packet.decode_request(total_data, get_pb2_module())
						return service_name, method_name, request_inst, response_class
					except Exception, ex:
						continue
Example #2
0
    def recv_data(self, response_type):
        log.debug('receiving data...')
        total_data = ''
        while True:
            data = None
            try:
                data = self.__socket.recv(SIZE)

                if not data:
                    log.debug('no more data in socket')
                    break

                log.debug('read chunk %d bytes' % len(data))
                total_data += data
                if response_type:
                    try:
                        decoded_packet = packet.decode_answer(
                            total_data, response_type)
                        log.debug('whole data packet was received.')
                        return decoded_packet
                    except Exception, ex:
                        continue

            except socket.error, err:
                #EAGAIN & EWOULDBLOCK
                if err.errno != 11:
                    raise err
                elif total_data and not response_type:
                    try:
                        service_name, method_name, request_inst, response_class = packet.decode_request(
                            total_data, get_pb2_module())
                        return service_name, method_name, request_inst, response_class
                    except Exception, ex:
                        continue
Example #3
0
	def handle_socket(self, socket):
		while(True):
			"""
			Reading packets
			"""
			log.info('Reading data from %s' % socket)
			data = socket.recv_data()
			#call method
			service_name, method_name, request_inst, response_class = packet.decode_request(data, get_pb2_module())
			log.info('rpc api %s.%s started' % (type(self).__name__, method_name))
			log.debug('rpc service object: %s (%s)' % (service_name, getattr(get_pb2_module(), service_name)))
			if not isinstance(self, getattr(get_pb2_module(), service_name) ):
				raise ProtoError('method %s expects service class %s, but found %s' %
								( method_name, service_name, type(self).__name__ )
								)
					
			done = None
			c = ProtoController()
			#creating implementation of requested server
			method = self.GetDescriptor().FindMethodByName(method_name)
			if not method:
				log.fatal('Failed to find method %s' % method_name)
				raise ProtoError('Failed to find method %s' % method_name)
			
			log.debug('rpc method : %s %s.%s() (%s)' % ( response_class.__name__, 
														service_name,
														method.name,
														method )
														)
				
			res = self.CallMethod(method, c, request_inst, self.callback)
			
			if res is None:
				log.fatal('rpc api %s.%s returned None'  % (service_name, method_name))
				socket.send_error_answer('No RPC response')
			elif c.Failed():
				log.fatal('rpc api %s.%s failed: %s' % (service_name, method_name, c.error) )
				#answer with error
				socket.send_error_answer(c.error)
			else:
				#create answer
				answer = packet.encode_answer(service_name, method_name, res, response_class)
				socket.send_data(answer)
				log.info('rpc call %s.%s finished' % (service_name, method_name))
			continue #reading