in source/extensions/filters/network/dubbo_proxy/hessian_utils.cc [268:330]
int HessianUtils::peekInt(Buffer::Instance& buffer, size_t* size, uint64_t offset) {
ASSERT(buffer.length() > offset);
uint8_t code = buffer.peekInt<uint8_t>(offset);
int result;
// Compact int
if (code >= 0x80 && code <= 0xbf) {
result = (code - 0x90);
*size = 1;
return result;
}
switch (code) {
case 0xc0:
case 0xc1:
case 0xc2:
case 0xc3:
case 0xc4:
case 0xc5:
case 0xc6:
case 0xc7:
case 0xc8:
case 0xc9:
case 0xca:
case 0xcb:
case 0xcd:
case 0xce:
case 0xcf:
if (offset + 2 > buffer.length()) {
throw EnvoyException("buffer underflow");
}
result = leftShift<int16_t>(code - 0xc8, 8) + buffer.peekInt<uint8_t>(offset + 1);
*size = 2;
return result;
case 0xd0:
case 0xd1:
case 0xd2:
case 0xd3:
case 0xd4:
case 0xd5:
case 0xd6:
case 0xd7:
if (offset + 3 > buffer.length()) {
throw EnvoyException("buffer underflow");
}
result = leftShift<int32_t>(code - 0xd4, 16) + (buffer.peekInt<uint8_t>(offset + 1) << 8) +
buffer.peekInt<uint8_t>(offset + 2);
*size = 3;
return result;
case 0x49:
if (offset + 5 > buffer.length()) {
throw EnvoyException("buffer underflow");
}
result = buffer.peekBEInt<int32_t>(offset + 1);
*size = 5;
return result;
}
throw EnvoyException(fmt::format("hessian type is not int {}", code));
}