in sdk/storage/azure-storage-blobs/src/rest_client.cpp [7593:7786]
Response<Models::UploadBlockBlobFromUriResult> BlockBlobClient::UploadFromUri(
Core::Http::_internal::HttpPipeline& pipeline,
const Core::Url& url,
const UploadBlockBlobFromUriOptions& options,
const Core::Context& context)
{
auto request = Core::Http::Request(Core::Http::HttpMethod::Put, url);
request.SetHeader("x-ms-blob-type", "BlockBlob");
request.SetHeader("Content-Length", "0");
if (!options.BlobContentType.empty())
{
request.SetHeader("x-ms-blob-content-type", options.BlobContentType);
}
if (!options.BlobContentEncoding.empty())
{
request.SetHeader("x-ms-blob-content-encoding", options.BlobContentEncoding);
}
if (!options.BlobContentLanguage.empty())
{
request.SetHeader("x-ms-blob-content-language", options.BlobContentLanguage);
}
if (!Core::Convert::Base64Encode(options.BlobContentMD5).empty())
{
request.SetHeader(
"x-ms-blob-content-md5", Core::Convert::Base64Encode(options.BlobContentMD5));
}
if (!options.BlobCacheControl.empty())
{
request.SetHeader("x-ms-blob-cache-control", options.BlobCacheControl);
}
for (const auto& p : options.Metadata)
{
request.SetHeader("x-ms-meta-" + p.first, p.second);
}
if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty())
{
request.SetHeader("x-ms-lease-id", options.LeaseId.Value());
}
if (!options.BlobContentDisposition.empty())
{
request.SetHeader("x-ms-blob-content-disposition", options.BlobContentDisposition);
}
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.EncryptionScope.HasValue() && !options.EncryptionScope.Value().empty())
{
request.SetHeader("x-ms-encryption-scope", options.EncryptionScope.Value());
}
if (options.Tier.HasValue() && !options.Tier.Value().ToString().empty())
{
request.SetHeader("x-ms-access-tier", options.Tier.Value().ToString());
}
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());
}
if (options.SourceIfModifiedSince.HasValue())
{
request.SetHeader(
"x-ms-source-if-modified-since",
options.SourceIfModifiedSince.Value().ToString(Azure::DateTime::DateFormat::Rfc1123));
}
if (options.SourceIfUnmodifiedSince.HasValue())
{
request.SetHeader(
"x-ms-source-if-unmodified-since",
options.SourceIfUnmodifiedSince.Value().ToString(Azure::DateTime::DateFormat::Rfc1123));
}
if (options.SourceIfMatch.HasValue() && !options.SourceIfMatch.ToString().empty())
{
request.SetHeader("x-ms-source-if-match", options.SourceIfMatch.ToString());
}
if (options.SourceIfNoneMatch.HasValue() && !options.SourceIfNoneMatch.ToString().empty())
{
request.SetHeader("x-ms-source-if-none-match", options.SourceIfNoneMatch.ToString());
}
if (options.SourceIfTags.HasValue() && !options.SourceIfTags.Value().empty())
{
request.SetHeader("x-ms-source-if-tags", options.SourceIfTags.Value());
}
request.SetHeader("x-ms-version", "2024-08-04");
if (options.SourceContentMD5.HasValue()
&& !Core::Convert::Base64Encode(options.SourceContentMD5.Value()).empty())
{
request.SetHeader(
"x-ms-source-content-md5",
Core::Convert::Base64Encode(options.SourceContentMD5.Value()));
}
if (options.BlobTagsString.HasValue() && !options.BlobTagsString.Value().empty())
{
request.SetHeader("x-ms-tags", options.BlobTagsString.Value());
}
if (!options.CopySource.empty())
{
request.SetHeader("x-ms-copy-source", options.CopySource);
}
if (options.CopySourceBlobProperties.HasValue())
{
request.SetHeader(
"x-ms-copy-source-blob-properties",
options.CopySourceBlobProperties.Value() ? "true" : "false");
}
if (options.CopySourceAuthorization.HasValue()
&& !options.CopySourceAuthorization.Value().empty())
{
request.SetHeader(
"x-ms-copy-source-authorization", options.CopySourceAuthorization.Value());
}
if (options.CopySourceTags.HasValue() && !options.CopySourceTags.Value().ToString().empty())
{
request.SetHeader("x-ms-copy-source-tag-option", options.CopySourceTags.Value().ToString());
}
if (options.SourceContentcrc64.HasValue()
&& !Core::Convert::Base64Encode(options.SourceContentcrc64.Value()).empty())
{
request.SetHeader(
"x-ms-source-content-crc64",
Core::Convert::Base64Encode(options.SourceContentcrc64.Value()));
}
auto pRawResponse = pipeline.Send(request, context);
auto httpStatusCode = pRawResponse->GetStatusCode();
if (httpStatusCode != Core::Http::HttpStatusCode::Created)
{
throw StorageException::CreateFromResponse(std::move(pRawResponse));
}
Models::UploadBlockBlobFromUriResult response;
response.ETag = ETag(pRawResponse->GetHeaders().at("ETag"));
response.LastModified = DateTime::Parse(
pRawResponse->GetHeaders().at("Last-Modified"), Azure::DateTime::DateFormat::Rfc1123);
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-version-id") != 0)
{
response.VersionId = pRawResponse->GetHeaders().at("x-ms-version-id");
}
response.IsServerEncrypted
= pRawResponse->GetHeaders().at("x-ms-request-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-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::UploadBlockBlobFromUriResult>(
std::move(response), std::move(pRawResponse));
}