std::string HessianUtils::peekByte()

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