in source/extensions/filters/network/dubbo_proxy/hessian_utils.cc [139:233]
long HessianUtils::peekLong(Buffer::Instance& buffer, size_t* size, uint64_t offset) {
ASSERT(buffer.length() > offset);
long result;
uint8_t code = buffer.peekInt<uint8_t>(offset);
switch (code) {
case 0xd8:
case 0xd9:
case 0xda:
case 0xdb:
case 0xdc:
case 0xdd:
case 0xde:
case 0xdf:
case 0xe0:
case 0xe1:
case 0xe2:
case 0xe3:
case 0xe4:
case 0xe5:
case 0xe6:
case 0xe7:
case 0xe8:
case 0xe9:
case 0xea:
case 0xee:
case 0xef:
result = code - 0xe0;
*size = 1;
return result;
case 0xf0:
case 0xf1:
case 0xf2:
case 0xf3:
case 0xf4:
case 0xf5:
case 0xf6:
case 0xf7:
case 0xf8:
case 0xf9:
case 0xfa:
case 0xfb:
case 0xfe:
case 0xff:
if (offset + 2 > buffer.length()) {
throw EnvoyException("buffer underflow");
}
result = leftShift<int16_t>(code - 0xf8, 8) + buffer.peekInt<uint8_t>(offset + 1);
*size = 2;
return result;
case 0x38:
case 0x39:
case 0x3a:
case 0x3b:
case 0x3c:
case 0x3d:
case 0x3e:
case 0x3f:
if (offset + 3 > buffer.length()) {
throw EnvoyException("buffer underflow");
}
result = leftShift<int32_t>(code - 0x3c, 16) + (buffer.peekInt<uint8_t>(offset + 1) << 8) +
buffer.peekInt<uint8_t>(offset + 2);
*size = 3;
return result;
case 0x59:
if (offset + 5 > buffer.length()) {
throw EnvoyException("buffer underflow");
}
result = buffer.peekBEInt<uint32_t>(offset + 1);
*size = 5;
return result;
case 0x4c:
if (offset + 9 > buffer.length()) {
throw EnvoyException("buffer underflow");
}
result = buffer.peekBEInt<int64_t>(offset + 1);
*size = 9;
return result;
}
throw EnvoyException(fmt::format("hessian type is not long {}", code));
}