Response BlobClient::GetProperties()

in sdk/storage/azure-storage-blobs/src/rest_client.cpp [3920:4196]


    Response<Models::BlobProperties> BlobClient::GetProperties(
        Core::Http::_internal::HttpPipeline& pipeline,
        const Core::Url& url,
        const GetBlobPropertiesOptions& options,
        const Core::Context& context)
    {
      auto request = Core::Http::Request(Core::Http::HttpMethod::Head, url);
      if (options.Snapshot.HasValue() && !options.Snapshot.Value().empty())
      {
        request.GetUrl().AppendQueryParameter(
            "snapshot", _internal::UrlEncodeQueryParameter(options.Snapshot.Value()));
      }
      if (options.VersionId.HasValue() && !options.VersionId.Value().empty())
      {
        request.GetUrl().AppendQueryParameter(
            "versionid", _internal::UrlEncodeQueryParameter(options.VersionId.Value()));
      }
      if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty())
      {
        request.SetHeader("x-ms-lease-id", options.LeaseId.Value());
      }
      if (options.EncryptionKey.HasValue() && !options.EncryptionKey.Value().empty())
      {
        request.SetHeader("x-ms-encryption-key", options.EncryptionKey.Value());
      }
      if (options.EncryptionKeySha256.HasValue()
          && !Core::Convert::Base64Encode(options.EncryptionKeySha256.Value()).empty())
      {
        request.SetHeader(
            "x-ms-encryption-key-sha256",
            Core::Convert::Base64Encode(options.EncryptionKeySha256.Value()));
      }
      if (options.EncryptionAlgorithm.HasValue() && !options.EncryptionAlgorithm.Value().empty())
      {
        request.SetHeader("x-ms-encryption-algorithm", options.EncryptionAlgorithm.Value());
      }
      if (options.IfModifiedSince.HasValue())
      {
        request.SetHeader(
            "If-Modified-Since",
            options.IfModifiedSince.Value().ToString(Azure::DateTime::DateFormat::Rfc1123));
      }
      if (options.IfUnmodifiedSince.HasValue())
      {
        request.SetHeader(
            "If-Unmodified-Since",
            options.IfUnmodifiedSince.Value().ToString(Azure::DateTime::DateFormat::Rfc1123));
      }
      if (options.IfMatch.HasValue() && !options.IfMatch.ToString().empty())
      {
        request.SetHeader("If-Match", options.IfMatch.ToString());
      }
      if (options.IfNoneMatch.HasValue() && !options.IfNoneMatch.ToString().empty())
      {
        request.SetHeader("If-None-Match", options.IfNoneMatch.ToString());
      }
      if (options.IfTags.HasValue() && !options.IfTags.Value().empty())
      {
        request.SetHeader("x-ms-if-tags", options.IfTags.Value());
      }
      request.SetHeader("x-ms-version", "2024-08-04");
      if (options.UserPrincipalName.HasValue())
      {
        request.SetHeader("x-ms-upn", options.UserPrincipalName.Value() ? "true" : "false");
      }
      auto pRawResponse = pipeline.Send(request, context);
      auto httpStatusCode = pRawResponse->GetStatusCode();
      if (httpStatusCode != Core::Http::HttpStatusCode::Ok)
      {
        throw StorageException::CreateFromResponse(std::move(pRawResponse));
      }
      Models::BlobProperties response;
      if (pRawResponse->GetHeaders().count("Last-Modified") != 0)
      {
        response.LastModified = DateTime::Parse(
            pRawResponse->GetHeaders().at("Last-Modified"), Azure::DateTime::DateFormat::Rfc1123);
      }
      response.CreatedOn = DateTime::Parse(
          pRawResponse->GetHeaders().at("x-ms-creation-time"),
          Azure::DateTime::DateFormat::Rfc1123);
      for (auto i = pRawResponse->GetHeaders().lower_bound("x-ms-meta-");
           i != pRawResponse->GetHeaders().end() && i->first.substr(0, 10) == "x-ms-meta-";
           ++i)
      {
        response.Metadata.emplace(i->first.substr(10), i->second);
      }
      if (pRawResponse->GetHeaders().count("x-ms-or-policy-id") != 0)
      {
        response.ObjectReplicationDestinationPolicyId
            = pRawResponse->GetHeaders().at("x-ms-or-policy-id");
      }
      response.BlobType = Models::BlobType(pRawResponse->GetHeaders().at("x-ms-blob-type"));
      if (pRawResponse->GetHeaders().count("x-ms-copy-completion-time") != 0)
      {
        response.CopyCompletedOn = DateTime::Parse(
            pRawResponse->GetHeaders().at("x-ms-copy-completion-time"),
            Azure::DateTime::DateFormat::Rfc1123);
      }
      if (pRawResponse->GetHeaders().count("x-ms-copy-status-description") != 0)
      {
        response.CopyStatusDescription
            = pRawResponse->GetHeaders().at("x-ms-copy-status-description");
      }
      if (pRawResponse->GetHeaders().count("x-ms-copy-id") != 0)
      {
        response.CopyId = pRawResponse->GetHeaders().at("x-ms-copy-id");
      }
      if (pRawResponse->GetHeaders().count("x-ms-copy-progress") != 0)
      {
        response.CopyProgress = pRawResponse->GetHeaders().at("x-ms-copy-progress");
      }
      if (pRawResponse->GetHeaders().count("x-ms-copy-source") != 0)
      {
        response.CopySource = pRawResponse->GetHeaders().at("x-ms-copy-source");
      }
      if (pRawResponse->GetHeaders().count("x-ms-copy-status") != 0)
      {
        response.CopyStatus = Models::CopyStatus(pRawResponse->GetHeaders().at("x-ms-copy-status"));
      }
      if (pRawResponse->GetHeaders().count("x-ms-incremental-copy") != 0)
      {
        response.IsIncrementalCopy
            = pRawResponse->GetHeaders().at("x-ms-incremental-copy") == std::string("true");
      }
      if (pRawResponse->GetHeaders().count("x-ms-copy-destination-snapshot") != 0)
      {
        response.IncrementalCopyDestinationSnapshot
            = pRawResponse->GetHeaders().at("x-ms-copy-destination-snapshot");
      }
      if (pRawResponse->GetHeaders().count("x-ms-lease-duration") != 0)
      {
        response.LeaseDuration
            = Models::LeaseDurationType(pRawResponse->GetHeaders().at("x-ms-lease-duration"));
      }
      if (pRawResponse->GetHeaders().count("x-ms-lease-state") != 0)
      {
        response.LeaseState = Models::LeaseState(pRawResponse->GetHeaders().at("x-ms-lease-state"));
      }
      if (pRawResponse->GetHeaders().count("x-ms-lease-status") != 0)
      {
        response.LeaseStatus
            = Models::LeaseStatus(pRawResponse->GetHeaders().at("x-ms-lease-status"));
      }
      response.BlobSize = std::stoll(pRawResponse->GetHeaders().at("Content-Length"));
      if (pRawResponse->GetHeaders().count("Content-Type") != 0)
      {
        response.HttpHeaders.ContentType = pRawResponse->GetHeaders().at("Content-Type");
      }
      if (pRawResponse->GetHeaders().count("ETag") != 0)
      {
        response.ETag = ETag(pRawResponse->GetHeaders().at("ETag"));
      }
      if (pRawResponse->GetHeaders().count("Content-MD5") != 0)
      {
        response.HttpHeaders.ContentHash.Value
            = Core::Convert::Base64Decode(pRawResponse->GetHeaders().at("Content-MD5"));
        response.HttpHeaders.ContentHash.Algorithm = HashAlgorithm::Md5;
      }
      if (pRawResponse->GetHeaders().count("Content-Encoding") != 0)
      {
        response.HttpHeaders.ContentEncoding = pRawResponse->GetHeaders().at("Content-Encoding");
      }
      if (pRawResponse->GetHeaders().count("Content-Disposition") != 0)
      {
        response.HttpHeaders.ContentDisposition
            = pRawResponse->GetHeaders().at("Content-Disposition");
      }
      if (pRawResponse->GetHeaders().count("Content-Language") != 0)
      {
        response.HttpHeaders.ContentLanguage = pRawResponse->GetHeaders().at("Content-Language");
      }
      if (pRawResponse->GetHeaders().count("Cache-Control") != 0)
      {
        response.HttpHeaders.CacheControl = pRawResponse->GetHeaders().at("Cache-Control");
      }
      if (pRawResponse->GetHeaders().count("x-ms-blob-sequence-number") != 0)
      {
        response.SequenceNumber
            = std::stoll(pRawResponse->GetHeaders().at("x-ms-blob-sequence-number"));
      }
      if (pRawResponse->GetHeaders().count("x-ms-blob-committed-block-count") != 0)
      {
        response.CommittedBlockCount
            = std::stoi(pRawResponse->GetHeaders().at("x-ms-blob-committed-block-count"));
      }
      response.IsServerEncrypted
          = pRawResponse->GetHeaders().at("x-ms-server-encrypted") == std::string("true");
      if (pRawResponse->GetHeaders().count("x-ms-encryption-key-sha256") != 0)
      {
        response.EncryptionKeySha256 = Core::Convert::Base64Decode(
            pRawResponse->GetHeaders().at("x-ms-encryption-key-sha256"));
      }
      if (pRawResponse->GetHeaders().count("x-ms-encryption-scope") != 0)
      {
        response.EncryptionScope = pRawResponse->GetHeaders().at("x-ms-encryption-scope");
      }
      if (pRawResponse->GetHeaders().count("x-ms-access-tier") != 0)
      {
        response.AccessTier = Models::AccessTier(pRawResponse->GetHeaders().at("x-ms-access-tier"));
      }
      if (pRawResponse->GetHeaders().count("x-ms-access-tier-inferred") != 0)
      {
        response.IsAccessTierInferred
            = pRawResponse->GetHeaders().at("x-ms-access-tier-inferred") == std::string("true");
      }
      if (pRawResponse->GetHeaders().count("x-ms-archive-status") != 0)
      {
        response.ArchiveStatus
            = Models::ArchiveStatus(pRawResponse->GetHeaders().at("x-ms-archive-status"));
      }
      if (pRawResponse->GetHeaders().count("x-ms-access-tier-change-time") != 0)
      {
        response.AccessTierChangedOn = DateTime::Parse(
            pRawResponse->GetHeaders().at("x-ms-access-tier-change-time"),
            Azure::DateTime::DateFormat::Rfc1123);
      }
      if (pRawResponse->GetHeaders().count("x-ms-version-id") != 0)
      {
        response.VersionId = pRawResponse->GetHeaders().at("x-ms-version-id");
      }
      if (pRawResponse->GetHeaders().count("x-ms-is-current-version") != 0)
      {
        response.IsCurrentVersion
            = pRawResponse->GetHeaders().at("x-ms-is-current-version") == std::string("true");
      }
      if (pRawResponse->GetHeaders().count("x-ms-tag-count") != 0)
      {
        response.TagCount = std::stoi(pRawResponse->GetHeaders().at("x-ms-tag-count"));
      }
      if (pRawResponse->GetHeaders().count("x-ms-expiry-time") != 0)
      {
        response.ExpiresOn = DateTime::Parse(
            pRawResponse->GetHeaders().at("x-ms-expiry-time"),
            Azure::DateTime::DateFormat::Rfc1123);
      }
      if (pRawResponse->GetHeaders().count("x-ms-blob-sealed") != 0)
      {
        response.IsSealed
            = pRawResponse->GetHeaders().at("x-ms-blob-sealed") == std::string("true");
      }
      if (pRawResponse->GetHeaders().count("x-ms-rehydrate-priority") != 0)
      {
        response.RehydratePriority
            = Models::RehydratePriority(pRawResponse->GetHeaders().at("x-ms-rehydrate-priority"));
      }
      if (pRawResponse->GetHeaders().count("x-ms-last-access-time") != 0)
      {
        response.LastAccessedOn = DateTime::Parse(
            pRawResponse->GetHeaders().at("x-ms-last-access-time"),
            Azure::DateTime::DateFormat::Rfc1123);
      }
      if (pRawResponse->GetHeaders().count("x-ms-immutability-policy-until-date") != 0)
      {
        if (!response.ImmutabilityPolicy.HasValue())
        {
          response.ImmutabilityPolicy = Models::BlobImmutabilityPolicy();
        }
        response.ImmutabilityPolicy.Value().ExpiresOn = DateTime::Parse(
            pRawResponse->GetHeaders().at("x-ms-immutability-policy-until-date"),
            Azure::DateTime::DateFormat::Rfc1123);
      }
      if (pRawResponse->GetHeaders().count("x-ms-immutability-policy-mode") != 0)
      {
        if (!response.ImmutabilityPolicy.HasValue())
        {
          response.ImmutabilityPolicy = Models::BlobImmutabilityPolicy();
        }
        response.ImmutabilityPolicy.Value().PolicyMode = Models::BlobImmutabilityPolicyMode(
            pRawResponse->GetHeaders().at("x-ms-immutability-policy-mode"));
      }
      if (pRawResponse->GetHeaders().count("x-ms-legal-hold") != 0)
      {
        response.HasLegalHold
            = pRawResponse->GetHeaders().at("x-ms-legal-hold") == std::string("true");
      }
      return Response<Models::BlobProperties>(std::move(response), std::move(pRawResponse));
    }