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
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
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