def send_req(self, flow_id, method_descriptor, rpc_controller, request, response_class, done, req_data): service_descriptor = method_descriptor.containing_service meta_info = rpc_meta_pb2.MetaInfo() meta_info.flow_id = flow_id meta_info.service_name = service_descriptor.full_name meta_info.method_name = method_descriptor.name serialized_req = serialize_message(meta_info, request) sent_bytes = 0 try: while sent_bytes < len(serialized_req): sent_bytes += self._socket.send(serialized_req[sent_bytes:]) except soc_error as e: logging.warning('socket error: ' + str(e)) rpc_controller.SetFailed((RpcController.SERVER_CLOSE_CONN_ERROR, 'connection has sending error')) self._finish_rpc(done, rpc_controller, None, req_data.is_async) self.close() return False req_data.begin_time = time.time() self._recv_infos[flow_id] = (meta_info, rpc_controller, response_class, done, req_data) self._stat.add_req_stat() if rpc_controller.method_timeout > 0: heapq.heappush(self._timeout_queue, (req_data.begin_time + rpc_controller.method_timeout, flow_id)) return True
def send_rsp(): while not is_connection_closed[0]: try: meta_info, rsp = rsp_queue.get(timeout=1) except gevent.queue.Empty: continue serialized_rsp = serialize_message(meta_info, rsp) sent_bytes = 0 try: while sent_bytes < len(serialized_rsp): sent_bytes += socket.send(serialized_rsp[sent_bytes:]) except soc_error as e: logging.warning('socket send error: ' + str(e)) break
def test_CallMethodWithWrongMetaInfo(self): channel = self.channel sock = channel.get_socket() self.assertEqual(0, channel.get_flow_id()) serialized_request = self.get_serialize_message(0, self.request) rsp = self.response_class(return_code=0, msg='SUCCESS') meta_info = rpc_meta_pb2.MetaInfo(flow_id=0, service_name='WrongServiceName', method_name='WrongMethodName') serialized_response = serialize_message(meta_info, rsp) sock.set_recv_content(serialized_response) controller = RpcController() actual_rsp = channel.CallMethod(self.method, controller, self.request, self.response_class, None) self.assertEqual(serialized_request, sock.get_send_content()) self.assertEqual(1, channel.get_flow_id()) self.assertIsNone(actual_rsp) self.assertTrue(controller.Failed()) self.assertEqual(RpcController.WRONG_RSP_META_ERROR, controller.err_code)
def test_CallMethodWithErrorInRspMeta(self): channel = self.channel sock = channel.get_socket() self.assertEqual(0, channel.get_flow_id()) serialized_request = self.get_serialize_message(0, self.request) rsp = rpc_meta_pb2.ErrorResponse(err_code=rpc_meta_pb2.SERVER_SERVICE_ERROR, err_msg='test error') meta_info = rpc_meta_pb2.MetaInfo(flow_id=0, service_name=self.service_descriptor.full_name, method_name=self.method.name, has_error=True) serialized_response = serialize_message(meta_info, rsp) sock.set_recv_content(serialized_response) controller = RpcController() actual_rsp = channel.CallMethod(self.method, controller, self.request, self.response_class, None) self.assertEqual(serialized_request, sock.get_send_content()) self.assertEqual(1, channel.get_flow_id()) self.assertIsNone(actual_rsp) self.assertTrue(controller.Failed()) self.assertEqual(rpc_meta_pb2.SERVER_SERVICE_ERROR, controller.err_code)
def get_serialize_message(self, flow_id, msg): meta_info = rpc_meta_pb2.MetaInfo( flow_id=flow_id, service_name=self.service_descriptor.full_name, method_name=self.method.name) return serialize_message(meta_info, msg)
def get_serialize_message(self, flow_id, service_desc, method_name, msg): has_error = isinstance(msg, rpc_meta_pb2.ErrorResponse) meta_info = rpc_meta_pb2.MetaInfo(flow_id=flow_id, service_name=service_desc.full_name, method_name=method_name, has_error=has_error) return serialize_message(meta_info, msg)