long HessianUtils::peekLong()

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