in source/extensions/filters/network/dubbo_proxy/hessian_utils.cc [451:510]
std::string HessianUtils::peekByte(Buffer::Instance& buffer, size_t* size, uint64_t offset) {
ASSERT(buffer.length() > offset);
std::string result;
uint8_t code = buffer.peekInt<uint8_t>(offset);
size_t delta_length = 0;
switch (code) {
case 0x20:
case 0x21:
case 0x22:
case 0x23:
case 0x24:
case 0x25:
case 0x26:
case 0x27:
case 0x28:
case 0x29:
case 0x2a:
case 0x2b:
case 0x2c:
case 0x2d:
case 0x2e:
case 0x2f:
delta_length = code - 0x20;
if (delta_length + 1 + offset > buffer.length()) {
throw EnvoyException("buffer underflow");
}
buffer.copyOut(offset + 1, delta_length, allocStringBuffer(&result, delta_length + 1));
*size = delta_length + 1;
return result;
case 0x42:
if (offset + 3 > buffer.length()) {
throw EnvoyException("buffer underflow");
}
delta_length = buffer.peekBEInt<uint16_t>(offset + 1);
if (delta_length + 3 + offset > buffer.length()) {
throw EnvoyException("buffer underflow");
}
buffer.copyOut(offset + 3, delta_length, allocStringBuffer(&result, delta_length + 1));
*size = delta_length + 3;
return result;
case 0x41:
if (offset + 3 > buffer.length()) {
throw EnvoyException("buffer underflow");
}
delta_length = buffer.peekBEInt<uint16_t>(offset + 1);
buffer.copyOut(offset + 3, delta_length, allocStringBuffer(&result, delta_length + 1));
size_t next_size;
result.append(peekByte(buffer, &next_size, delta_length + 3 + offset));
*size = delta_length + 3 + next_size;
return result;
}
throw EnvoyException(fmt::format("hessian type is not byte {}", code));
}