int HessianUtils::peekInt()

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));
}