def _apply(self, request_data, expected_response_type=None): logger.debug("Sending request\n%s", pprint.pformat(request_data)) request_name = request_data.__class__.__name__ message = common_pb2.WireMessage() message.name = 'org.apache.calcite.avatica.proto.Requests${}'.format(request_name) message.wrapped_message = request_data.SerializeToString() body = message.SerializeToString() headers = {'content-type': 'application/x-google-protobuf'} response = self._post_request(body, headers) response_body = response.read() if response.status != httplib.OK: logger.debug("Received response\n%s", response_body) if b'<html>' in response_body: parse_error_page(response_body) else: # assume the response is in protobuf format parse_error_protobuf(response_body) raise errors.InterfaceError('RPC request returned invalid status code', response.status) message = common_pb2.WireMessage() message.ParseFromString(response_body) logger.debug("Received response\n%s", message) if expected_response_type is None: expected_response_type = request_name.replace('Request', 'Response') expected_response_type = 'org.apache.calcite.avatica.proto.Responses$' + expected_response_type if message.name != expected_response_type: raise errors.InterfaceError('unexpected response type "{}"'.format(message.name)) return message.wrapped_message
def parse_error_protobuf(text): message = common_pb2.WireMessage() message.ParseFromString(text) err = responses_pb2.ErrorResponse() err.ParseFromString(message.wrapped_message) parse_and_raise_sql_error(err.error_message) raise_sql_error(err.error_code, err.sql_state, err.error_message) raise errors.InternalError(err.error_message)
def parse_error_protobuf(text): try: message = common_pb2.WireMessage() message.ParseFromString(text) err = responses_pb2.ErrorResponse() if not err.ParseFromString(message.wrapped_message): raise Exception('No error message found') except Exception: # Not a protobuf error, fall through return parse_and_raise_sql_error(err.error_message) raise_sql_error(err.error_code, err.sql_state, err.error_message)