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