in sdk/storage/azure-storage-blobs/src/rest_client.cpp [3625:3919]
Response<Models::DownloadBlobResult> BlobClient::Download(
Core::Http::_internal::HttpPipeline& pipeline,
const Core::Url& url,
const DownloadBlobOptions& options,
const Core::Context& context)
{
auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url, false);
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.Range.HasValue() && !options.Range.Value().empty())
{
request.SetHeader("x-ms-range", options.Range.Value());
}
if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty())
{
request.SetHeader("x-ms-lease-id", options.LeaseId.Value());
}
if (options.RangeGetContentMD5.HasValue())
{
request.SetHeader(
"x-ms-range-get-content-md5", options.RangeGetContentMD5.Value() ? "true" : "false");
}
if (options.RangeGetContentCRC64.HasValue())
{
request.SetHeader(
"x-ms-range-get-content-crc64",
options.RangeGetContentCRC64.Value() ? "true" : "false");
}
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
|| httpStatusCode == Core::Http::HttpStatusCode::PartialContent))
{
throw StorageException::CreateFromResponse(std::move(pRawResponse));
}
Models::DownloadBlobResult response;
response.BodyStream = pRawResponse->ExtractBodyStream();
if (pRawResponse->GetHeaders().count("Last-Modified") != 0)
{
response.Details.LastModified = DateTime::Parse(
pRawResponse->GetHeaders().at("Last-Modified"), Azure::DateTime::DateFormat::Rfc1123);
}
response.Details.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.Details.Metadata.emplace(i->first.substr(10), i->second);
}
if (pRawResponse->GetHeaders().count("x-ms-or-policy-id") != 0)
{
response.Details.ObjectReplicationDestinationPolicyId
= pRawResponse->GetHeaders().at("x-ms-or-policy-id");
}
if (pRawResponse->GetHeaders().count("Content-Type") != 0)
{
response.Details.HttpHeaders.ContentType = pRawResponse->GetHeaders().at("Content-Type");
}
if (pRawResponse->GetHeaders().count("ETag") != 0)
{
response.Details.ETag = ETag(pRawResponse->GetHeaders().at("ETag"));
}
if (pRawResponse->GetHeaders().count("Content-Encoding") != 0)
{
response.Details.HttpHeaders.ContentEncoding
= pRawResponse->GetHeaders().at("Content-Encoding");
}
if (pRawResponse->GetHeaders().count("Cache-Control") != 0)
{
response.Details.HttpHeaders.CacheControl = pRawResponse->GetHeaders().at("Cache-Control");
}
if (pRawResponse->GetHeaders().count("Content-Disposition") != 0)
{
response.Details.HttpHeaders.ContentDisposition
= pRawResponse->GetHeaders().at("Content-Disposition");
}
if (pRawResponse->GetHeaders().count("Content-Language") != 0)
{
response.Details.HttpHeaders.ContentLanguage
= pRawResponse->GetHeaders().at("Content-Language");
}
if (pRawResponse->GetHeaders().count("x-ms-blob-sequence-number") != 0)
{
response.Details.SequenceNumber
= std::stoll(pRawResponse->GetHeaders().at("x-ms-blob-sequence-number"));
}
response.BlobType = Models::BlobType(pRawResponse->GetHeaders().at("x-ms-blob-type"));
if (pRawResponse->GetHeaders().count("x-ms-copy-completion-time") != 0)
{
response.Details.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.Details.CopyStatusDescription
= pRawResponse->GetHeaders().at("x-ms-copy-status-description");
}
if (pRawResponse->GetHeaders().count("x-ms-copy-id") != 0)
{
response.Details.CopyId = pRawResponse->GetHeaders().at("x-ms-copy-id");
}
if (pRawResponse->GetHeaders().count("x-ms-copy-progress") != 0)
{
response.Details.CopyProgress = pRawResponse->GetHeaders().at("x-ms-copy-progress");
}
if (pRawResponse->GetHeaders().count("x-ms-copy-source") != 0)
{
response.Details.CopySource = pRawResponse->GetHeaders().at("x-ms-copy-source");
}
if (pRawResponse->GetHeaders().count("x-ms-copy-status") != 0)
{
response.Details.CopyStatus
= Models::CopyStatus(pRawResponse->GetHeaders().at("x-ms-copy-status"));
}
if (pRawResponse->GetHeaders().count("x-ms-lease-duration") != 0)
{
response.Details.LeaseDuration
= Models::LeaseDurationType(pRawResponse->GetHeaders().at("x-ms-lease-duration"));
}
if (pRawResponse->GetHeaders().count("x-ms-lease-state") != 0)
{
response.Details.LeaseState
= Models::LeaseState(pRawResponse->GetHeaders().at("x-ms-lease-state"));
}
if (pRawResponse->GetHeaders().count("x-ms-lease-status") != 0)
{
response.Details.LeaseStatus
= Models::LeaseStatus(pRawResponse->GetHeaders().at("x-ms-lease-status"));
}
if (pRawResponse->GetHeaders().count("x-ms-version-id") != 0)
{
response.Details.VersionId = pRawResponse->GetHeaders().at("x-ms-version-id");
}
if (pRawResponse->GetHeaders().count("x-ms-is-current-version") != 0)
{
response.Details.IsCurrentVersion
= pRawResponse->GetHeaders().at("x-ms-is-current-version") == std::string("true");
}
if (pRawResponse->GetHeaders().count("x-ms-blob-committed-block-count") != 0)
{
response.Details.CommittedBlockCount
= std::stoi(pRawResponse->GetHeaders().at("x-ms-blob-committed-block-count"));
}
response.Details.IsServerEncrypted
= pRawResponse->GetHeaders().at("x-ms-server-encrypted") == std::string("true");
if (pRawResponse->GetHeaders().count("x-ms-encryption-key-sha256") != 0)
{
response.Details.EncryptionKeySha256 = Core::Convert::Base64Decode(
pRawResponse->GetHeaders().at("x-ms-encryption-key-sha256"));
}
if (pRawResponse->GetHeaders().count("x-ms-encryption-scope") != 0)
{
response.Details.EncryptionScope = pRawResponse->GetHeaders().at("x-ms-encryption-scope");
}
if (pRawResponse->GetHeaders().count("x-ms-tag-count") != 0)
{
response.Details.TagCount = std::stoi(pRawResponse->GetHeaders().at("x-ms-tag-count"));
}
if (pRawResponse->GetHeaders().count("x-ms-blob-sealed") != 0)
{
response.Details.IsSealed
= pRawResponse->GetHeaders().at("x-ms-blob-sealed") == std::string("true");
}
if (pRawResponse->GetHeaders().count("x-ms-last-access-time") != 0)
{
response.Details.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.Details.ImmutabilityPolicy.HasValue())
{
response.Details.ImmutabilityPolicy = Models::BlobImmutabilityPolicy();
}
response.Details.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.Details.ImmutabilityPolicy.HasValue())
{
response.Details.ImmutabilityPolicy = Models::BlobImmutabilityPolicy();
}
response.Details.ImmutabilityPolicy.Value().PolicyMode = Models::BlobImmutabilityPolicyMode(
pRawResponse->GetHeaders().at("x-ms-immutability-policy-mode"));
}
if (pRawResponse->GetHeaders().count("x-ms-legal-hold") != 0)
{
response.Details.HasLegalHold
= pRawResponse->GetHeaders().at("x-ms-legal-hold") == std::string("true");
}
if (httpStatusCode == Core::Http::HttpStatusCode::Ok)
{
if (pRawResponse->GetHeaders().count("Content-MD5") != 0)
{
response.Details.HttpHeaders.ContentHash.Value
= Core::Convert::Base64Decode(pRawResponse->GetHeaders().at("Content-MD5"));
response.Details.HttpHeaders.ContentHash.Algorithm = HashAlgorithm::Md5;
}
}
if (httpStatusCode == Core::Http::HttpStatusCode::Ok)
{
if (pRawResponse->GetHeaders().count("Content-MD5") != 0)
{
response.TransactionalContentHash = ContentHash();
response.TransactionalContentHash.Value().Value
= Core::Convert::Base64Decode(pRawResponse->GetHeaders().at("Content-MD5"));
response.TransactionalContentHash.Value().Algorithm = HashAlgorithm::Md5;
}
}
if (pRawResponse->GetHeaders().count("x-ms-blob-content-md5") != 0)
{
response.Details.HttpHeaders.ContentHash.Value
= Core::Convert::Base64Decode(pRawResponse->GetHeaders().at("x-ms-blob-content-md5"));
response.Details.HttpHeaders.ContentHash.Algorithm = HashAlgorithm::Md5;
}
if (httpStatusCode == Core::Http::HttpStatusCode::PartialContent)
{
if (pRawResponse->GetHeaders().count("Content-MD5") != 0)
{
response.TransactionalContentHash = ContentHash();
response.TransactionalContentHash.Value().Value
= Core::Convert::Base64Decode(pRawResponse->GetHeaders().at("Content-MD5"));
response.TransactionalContentHash.Value().Algorithm = HashAlgorithm::Md5;
}
}
if (httpStatusCode == Core::Http::HttpStatusCode::PartialContent)
{
if (pRawResponse->GetHeaders().count("x-ms-content-crc64") != 0)
{
response.TransactionalContentHash = ContentHash();
response.TransactionalContentHash.Value().Value
= Core::Convert::Base64Decode(pRawResponse->GetHeaders().at("x-ms-content-crc64"));
response.TransactionalContentHash.Value().Algorithm = HashAlgorithm::Crc64;
}
}
return Response<Models::DownloadBlobResult>(std::move(response), std::move(pRawResponse));
}