readHeaderFormat method

void readHeaderFormat(
  1. int headerSize,
  2. Int8List buff
)

Implementation

void readHeaderFormat(int headerSize, Int8List buff) {
  nio.ByteBuffer frame = nio.ByteBuffer.wrap(buff);

  frame.position = 10; // Advance past version, flags, seqid

  headerSize = headerSize * 4;
  int endHeader = headerSize + frame.position;

  if (headerSize > frame.remaining()) {
    throw TTransportError(null, "Header size is larger than frame");
  }

  _protoId = readVarint32Buf(frame);
  int numTransforms = readVarint32Buf(frame);

  // Clear out any previous transforms
  _readTransforms = <int>[];

  if (_protoId == T_JSON_PROTOCOL && clientType != ClientTypes.HTTP) {
    throw TTransportError(null, "Trying to recv JSON encoding over binary");
  }

  // Read in the headers.  Data for each varies. See
  // doc/HeaderFormat.txt
  int hmacSz = 0;
  for (int i = 0; i < numTransforms; i++) {
    int transId = readVarint32Buf(frame);
    if (transId == Transforms.ZLIB_TRANSFORM.value) {
      _readTransforms.add(transId);
    } else if (transId == Transforms.SNAPPY_TRANSFORM.value) {
      throw TTransportError(null, "Snappy transform no longer supported");
    } else if (transId == Transforms.HMAC_TRANSFORM.value) {
      throw TTransportError(null, "Hmac transform no longer supported");
    } else {
      throw TTransportError(null, "Unknown transform during recv");
    }
  }

  // Read the info section.
  _readHeaders.clear();
  while (frame.position < endHeader) {
    int infoId = readVarint32Buf(frame);
    if (infoId == Infos.INFO_KEYVALUE.value) {
      int numKeys = readVarint32Buf(frame);
      for (int i = 0; i < numKeys; i++) {
        String key = readString(frame);
        String value = readString(frame);
        _readHeaders[key] = value;
      }
    } else if (infoId == Infos.INFO_PKEYVALUE.value) {
      int numKeys = readVarint32Buf(frame);
      for (int i = 0; i < numKeys; i++) {
        String key = readString(frame);
        String value = readString(frame);
        readPersistentHeaders[key] = value;
      }
    } else {
      // Unknown info ID, continue on to reading data.
      break;
    }
  }

  _readHeaders.addAll(readPersistentHeaders);

  // Read in the data section.
  frame.position = endHeader;
  frame.limit = frame.limit - hmacSz; // limit to data without mac

  frame = untransform(frame);
  readBuffer_?.reset(
      buf: frame.array(), offset: frame.position, length: frame.remaining());
}