readHeaderFormat method
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());
}