Storage STG98 Features (#6501)
* get set acl oauth (#6405) * Storage STG98/Added support for x-ms-file-request-intent for blob copy APIs (#6406) * Source File Copy Support * Storage STG98/NFS 2 (#6404) * feature * add test record * Update blob sas new string to sign (#6511)
This commit is contained in:
parent
2e7848d736
commit
c9f07f1389
@ -2,5 +2,5 @@
|
||||
"AssetsRepo": "Azure/azure-sdk-assets",
|
||||
"AssetsRepoPrefixPath": "cpp",
|
||||
"TagPrefix": "cpp/storage",
|
||||
"Tag": "cpp/storage_57a579efb6"
|
||||
"Tag": "cpp/storage_7bea1dff90"
|
||||
}
|
||||
|
||||
@ -640,6 +640,12 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
* source.
|
||||
*/
|
||||
std::string SourceAuthorization;
|
||||
|
||||
/**
|
||||
* Optional, only applicable (but required) when the source is Azure Storage Files and using
|
||||
* token authentication. Used to indicate the intent of the request.
|
||||
*/
|
||||
Azure::Nullable<Models::FileShareTokenIntent> FileRequestIntent;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -1017,6 +1023,12 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
* source.
|
||||
*/
|
||||
std::string SourceAuthorization;
|
||||
|
||||
/**
|
||||
* Optional, only applicable (but required) when the source is Azure Storage Files and using
|
||||
* token authentication. Used to indicate the intent of the request.
|
||||
*/
|
||||
Azure::Nullable<Models::FileShareTokenIntent> FileRequestIntent;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -1073,6 +1085,12 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
* source.
|
||||
*/
|
||||
std::string SourceAuthorization;
|
||||
|
||||
/**
|
||||
* Optional, only applicable (but required) when the source is Azure Storage Files and using
|
||||
* token authentication. Used to indicate the intent of the request.
|
||||
*/
|
||||
Azure::Nullable<Models::FileShareTokenIntent> FileRequestIntent;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -1366,6 +1384,12 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
* source.
|
||||
*/
|
||||
std::string SourceAuthorization;
|
||||
|
||||
/**
|
||||
* Optional, only applicable (but required) when the source is Azure Storage Files and using
|
||||
* token authentication. Used to indicate the intent of the request.
|
||||
*/
|
||||
Azure::Nullable<Models::FileShareTokenIntent> FileRequestIntent;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -1477,6 +1501,12 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
* source.
|
||||
*/
|
||||
std::string SourceAuthorization;
|
||||
|
||||
/**
|
||||
* Optional, only applicable (but required) when the source is Azure Storage Files and using
|
||||
* token authentication. Used to indicate the intent of the request.
|
||||
*/
|
||||
Azure::Nullable<Models::FileShareTokenIntent> FileRequestIntent;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@ -32,7 +32,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
/**
|
||||
* The version used for the operations to Azure storage services.
|
||||
*/
|
||||
constexpr static const char* ApiVersion = "2024-08-04";
|
||||
constexpr static const char* ApiVersion = "2025-07-05";
|
||||
} // namespace _detail
|
||||
namespace Models {
|
||||
/**
|
||||
@ -1756,7 +1756,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
/**
|
||||
* The tier of page blob on a premium storage account or tier of block blob on blob storage
|
||||
* LRS accounts. For a list of allowed premium page blob tiers, see
|
||||
* https://learn.microsoft.com/en-us/azure/virtual-machines/windows/premium-storage#features.
|
||||
* https://docs.microsoft.com/en-us/azure/virtual-machines/windows/premium-storage#features.
|
||||
* For blob storage LRS accounts, valid values are Hot/Cool/Archive.
|
||||
*/
|
||||
Nullable<Models::AccessTier> AccessTier;
|
||||
@ -2182,6 +2182,20 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
/** Constant value of type BlobCopySourceTagsMode: Copy */
|
||||
AZ_STORAGE_BLOBS_DLLEXPORT const static BlobCopySourceTagsMode Copy;
|
||||
};
|
||||
/**
|
||||
* @brief Valid value is backup.
|
||||
*/
|
||||
class FileShareTokenIntent final
|
||||
: public Core::_internal::ExtendableEnumeration<FileShareTokenIntent> {
|
||||
public:
|
||||
/** Constructs a new FileShareTokenIntent instance */
|
||||
FileShareTokenIntent() = default;
|
||||
/** Constructs a new FileShareTokenIntent from a string. */
|
||||
explicit FileShareTokenIntent(std::string value) : ExtendableEnumeration(std::move(value)) {}
|
||||
|
||||
/** Constant value of type FileShareTokenIntent: Backup */
|
||||
AZ_STORAGE_BLOBS_DLLEXPORT const static FileShareTokenIntent Backup;
|
||||
};
|
||||
/**
|
||||
* @brief Response type for #Azure::Storage::Blobs::BlobClient::CopyFromUri.
|
||||
*/
|
||||
@ -3779,6 +3793,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
Nullable<std::string> CopySourceAuthorization;
|
||||
Nullable<std::string> EncryptionScope;
|
||||
Nullable<Models::BlobCopySourceTagsMode> CopySourceTags;
|
||||
Nullable<Models::FileShareTokenIntent> FileRequestIntent;
|
||||
Nullable<std::vector<std::uint8_t>> SourceContentcrc64;
|
||||
};
|
||||
static Response<Models::CopyBlobFromUriResult> CopyFromUri(
|
||||
@ -3971,6 +3986,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
ETag SourceIfMatch;
|
||||
ETag SourceIfNoneMatch;
|
||||
Nullable<std::string> CopySourceAuthorization;
|
||||
Nullable<Models::FileShareTokenIntent> FileRequestIntent;
|
||||
};
|
||||
static Response<Models::UploadPagesFromUriResult> UploadPagesFromUri(
|
||||
Core::Http::_internal::HttpPipeline& pipeline,
|
||||
@ -4143,6 +4159,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
ETag SourceIfMatch;
|
||||
ETag SourceIfNoneMatch;
|
||||
Nullable<std::string> CopySourceAuthorization;
|
||||
Nullable<Models::FileShareTokenIntent> FileRequestIntent;
|
||||
};
|
||||
static Response<Models::AppendBlockFromUriResult> AppendBlockFromUri(
|
||||
Core::Http::_internal::HttpPipeline& pipeline,
|
||||
@ -4230,6 +4247,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
Nullable<bool> CopySourceBlobProperties;
|
||||
Nullable<std::string> CopySourceAuthorization;
|
||||
Nullable<Models::BlobCopySourceTagsMode> CopySourceTags;
|
||||
Nullable<Models::FileShareTokenIntent> FileRequestIntent;
|
||||
Nullable<std::vector<std::uint8_t>> SourceContentcrc64;
|
||||
};
|
||||
static Response<Models::UploadBlockBlobFromUriResult> UploadFromUri(
|
||||
@ -4271,6 +4289,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
ETag SourceIfMatch;
|
||||
ETag SourceIfNoneMatch;
|
||||
Nullable<std::string> CopySourceAuthorization;
|
||||
Nullable<Models::FileShareTokenIntent> FileRequestIntent;
|
||||
};
|
||||
static Response<Models::StageBlockFromUriResult> StageBlockFromUri(
|
||||
Core::Http::_internal::HttpPipeline& pipeline,
|
||||
|
||||
@ -220,6 +220,8 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
protocolLayerOptions.CopySourceAuthorization = options.SourceAuthorization;
|
||||
}
|
||||
protocolLayerOptions.FileRequestIntent = options.FileRequestIntent;
|
||||
|
||||
return _detail::AppendBlobClient::AppendBlockFromUri(
|
||||
*m_pipeline, m_blobUrl, protocolLayerOptions, context);
|
||||
}
|
||||
|
||||
@ -714,6 +714,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
protocolLayerOptions.CopySourceAuthorization = options.SourceAuthorization;
|
||||
}
|
||||
protocolLayerOptions.FileRequestIntent = options.FileRequestIntent;
|
||||
|
||||
return _detail::BlobClient::CopyFromUri(*m_pipeline, m_blobUrl, protocolLayerOptions, context);
|
||||
}
|
||||
|
||||
@ -261,7 +261,7 @@ namespace Azure { namespace Storage { namespace Sas {
|
||||
+ canonicalName + "\n" + userDelegationKey.SignedObjectId + "\n"
|
||||
+ userDelegationKey.SignedTenantId + "\n" + signedStartsOnStr + "\n" + signedExpiresOnStr
|
||||
+ "\n" + userDelegationKey.SignedService + "\n" + userDelegationKey.SignedVersion
|
||||
+ "\n\n\n\n" + (IPRange.HasValue() ? IPRange.Value() : "") + "\n" + protocol + "\n"
|
||||
+ "\n\n\n\n\n\n" + (IPRange.HasValue() ? IPRange.Value() : "") + "\n" + protocol + "\n"
|
||||
+ SasVersion + "\n" + resource + "\n" + snapshotVersion + "\n" + EncryptionScope + "\n"
|
||||
+ CacheControl + "\n" + ContentDisposition + "\n" + ContentEncoding + "\n" + ContentLanguage
|
||||
+ "\n" + ContentType;
|
||||
@ -397,7 +397,7 @@ namespace Azure { namespace Storage { namespace Sas {
|
||||
return Permissions + "\n" + startsOnStr + "\n" + expiresOnStr + "\n" + canonicalName + "\n"
|
||||
+ userDelegationKey.SignedObjectId + "\n" + userDelegationKey.SignedTenantId + "\n"
|
||||
+ signedStartsOnStr + "\n" + signedExpiresOnStr + "\n" + userDelegationKey.SignedService
|
||||
+ "\n" + userDelegationKey.SignedVersion + "\n\n\n\n"
|
||||
+ "\n" + userDelegationKey.SignedVersion + "\n\n\n\n\n\n"
|
||||
+ (IPRange.HasValue() ? IPRange.Value() : "") + "\n" + protocol + "\n" + SasVersion + "\n"
|
||||
+ resource + "\n" + snapshotVersion + "\n" + EncryptionScope + "\n" + CacheControl + "\n"
|
||||
+ ContentDisposition + "\n" + ContentEncoding + "\n" + ContentLanguage + "\n" + ContentType;
|
||||
|
||||
@ -383,6 +383,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
protocolLayerOptions.CopySourceAuthorization = options.SourceAuthorization;
|
||||
}
|
||||
protocolLayerOptions.FileRequestIntent = options.FileRequestIntent;
|
||||
|
||||
return _detail::BlockBlobClient::UploadFromUri(
|
||||
*m_pipeline, m_blobUrl, protocolLayerOptions, context);
|
||||
@ -467,6 +468,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
protocolLayerOptions.CopySourceAuthorization = options.SourceAuthorization;
|
||||
}
|
||||
protocolLayerOptions.FileRequestIntent = options.FileRequestIntent;
|
||||
|
||||
return _detail::BlockBlobClient::StageBlockFromUri(
|
||||
*m_pipeline, m_blobUrl, protocolLayerOptions, context);
|
||||
|
||||
@ -237,6 +237,8 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
protocolLayerOptions.CopySourceAuthorization = options.SourceAuthorization;
|
||||
}
|
||||
protocolLayerOptions.FileRequestIntent = options.FileRequestIntent;
|
||||
|
||||
return _detail::PageBlobClient::UploadPagesFromUri(
|
||||
*m_pipeline, m_blobUrl, protocolLayerOptions, context);
|
||||
}
|
||||
|
||||
@ -173,6 +173,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
const ScheduleBlobExpiryOriginType ScheduleBlobExpiryOriginType::Absolute("Absolute");
|
||||
const BlobCopySourceTagsMode BlobCopySourceTagsMode::Replace("REPLACE");
|
||||
const BlobCopySourceTagsMode BlobCopySourceTagsMode::Copy("COPY");
|
||||
const FileShareTokenIntent FileShareTokenIntent::Backup("backup");
|
||||
namespace _detail {
|
||||
const QueryRequestQueryType QueryRequestQueryType::SQL("SQL");
|
||||
const QueryFormatType QueryFormatType::Delimited("delimited");
|
||||
@ -377,7 +378,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
request.SetHeader("Content-Length", std::to_string(requestBody.Length()));
|
||||
request.GetUrl().AppendQueryParameter("restype", "service");
|
||||
request.GetUrl().AppendQueryParameter("comp", "properties");
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Accepted)
|
||||
@ -397,7 +398,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url);
|
||||
request.GetUrl().AppendQueryParameter("restype", "service");
|
||||
request.GetUrl().AppendQueryParameter("comp", "properties");
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
(void)options;
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
@ -693,7 +694,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url);
|
||||
request.GetUrl().AppendQueryParameter("restype", "service");
|
||||
request.GetUrl().AppendQueryParameter("comp", "stats");
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
(void)options;
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
@ -793,7 +794,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
_internal::UrlEncodeQueryParameter(
|
||||
ListBlobContainersIncludeFlagsToString(options.Include.Value())));
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Ok)
|
||||
@ -1078,7 +1079,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
request.SetHeader("Content-Length", std::to_string(requestBody.Length()));
|
||||
request.GetUrl().AppendQueryParameter("restype", "service");
|
||||
request.GetUrl().AppendQueryParameter("comp", "userdelegationkey");
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Ok)
|
||||
@ -1193,7 +1194,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url);
|
||||
request.GetUrl().AppendQueryParameter("restype", "account");
|
||||
request.GetUrl().AppendQueryParameter("comp", "properties");
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
(void)options;
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
@ -1223,7 +1224,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("Content-Type", options.MultipartContentType);
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Accepted)
|
||||
@ -1244,7 +1245,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url);
|
||||
request.GetUrl().AppendQueryParameter("comp", "blobs");
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.Where.HasValue() && !options.Where.Value().empty())
|
||||
{
|
||||
request.GetUrl().AppendQueryParameter(
|
||||
@ -1400,7 +1401,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-blob-public-access", options.Access.ToString());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.DefaultEncryptionScope.HasValue()
|
||||
&& !options.DefaultEncryptionScope.Value().empty())
|
||||
{
|
||||
@ -1437,7 +1438,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-lease-id", options.LeaseId.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Ok)
|
||||
@ -1515,7 +1516,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
"If-Unmodified-Since",
|
||||
options.IfUnmodifiedSince.Value().ToString(Azure::DateTime::DateFormat::Rfc1123));
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Accepted)
|
||||
@ -1549,7 +1550,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
"If-Modified-Since",
|
||||
options.IfModifiedSince.Value().ToString(Azure::DateTime::DateFormat::Rfc1123));
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Ok)
|
||||
@ -1576,7 +1577,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-lease-id", options.LeaseId.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Ok)
|
||||
@ -1745,7 +1746,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
"If-Unmodified-Since",
|
||||
options.IfUnmodifiedSince.Value().ToString(Azure::DateTime::DateFormat::Rfc1123));
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Ok)
|
||||
@ -1768,7 +1769,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
auto request = Core::Http::Request(Core::Http::HttpMethod::Put, url);
|
||||
request.GetUrl().AppendQueryParameter("restype", "container");
|
||||
request.GetUrl().AppendQueryParameter("comp", "undelete");
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.DeletedContainerName.HasValue() && !options.DeletedContainerName.Value().empty())
|
||||
{
|
||||
request.SetHeader("x-ms-deleted-container-name", options.DeletedContainerName.Value());
|
||||
@ -1798,7 +1799,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
auto request = Core::Http::Request(Core::Http::HttpMethod::Put, url);
|
||||
request.GetUrl().AppendQueryParameter("restype", "container");
|
||||
request.GetUrl().AppendQueryParameter("comp", "rename");
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (!options.SourceContainerName.empty())
|
||||
{
|
||||
request.SetHeader("x-ms-source-container-name", options.SourceContainerName);
|
||||
@ -1832,7 +1833,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("Content-Type", options.MultipartContentType);
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Accepted)
|
||||
@ -1854,7 +1855,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url);
|
||||
request.GetUrl().AppendQueryParameter("restype", "container");
|
||||
request.GetUrl().AppendQueryParameter("comp", "blobs");
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.Where.HasValue() && !options.Where.Value().empty())
|
||||
{
|
||||
request.GetUrl().AppendQueryParameter(
|
||||
@ -2024,7 +2025,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
"If-Unmodified-Since",
|
||||
options.IfUnmodifiedSince.Value().ToString(Azure::DateTime::DateFormat::Rfc1123));
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Created)
|
||||
@ -2065,7 +2066,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
"If-Unmodified-Since",
|
||||
options.IfUnmodifiedSince.Value().ToString(Azure::DateTime::DateFormat::Rfc1123));
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Ok)
|
||||
@ -2105,7 +2106,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
"If-Unmodified-Since",
|
||||
options.IfUnmodifiedSince.Value().ToString(Azure::DateTime::DateFormat::Rfc1123));
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Ok)
|
||||
@ -2146,7 +2147,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
"If-Unmodified-Since",
|
||||
options.IfUnmodifiedSince.Value().ToString(Azure::DateTime::DateFormat::Rfc1123));
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Accepted)
|
||||
@ -2191,7 +2192,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
"If-Unmodified-Since",
|
||||
options.IfUnmodifiedSince.Value().ToString(Azure::DateTime::DateFormat::Rfc1123));
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Ok)
|
||||
@ -2238,7 +2239,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
_internal::UrlEncodeQueryParameter(
|
||||
ListBlobsIncludeFlagsToString(options.Include.Value())));
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Ok)
|
||||
@ -2917,7 +2918,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
_internal::UrlEncodeQueryParameter(
|
||||
ListBlobsIncludeFlagsToString(options.Include.Value())));
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.ShowOnly.HasValue() && !options.ShowOnly.Value().empty())
|
||||
{
|
||||
request.GetUrl().AppendQueryParameter(
|
||||
@ -3606,7 +3607,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url);
|
||||
request.GetUrl().AppendQueryParameter("restype", "account");
|
||||
request.GetUrl().AppendQueryParameter("comp", "properties");
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
(void)options;
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
@ -3697,7 +3698,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-if-tags", options.IfTags.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.UserPrincipalName.HasValue())
|
||||
{
|
||||
request.SetHeader("x-ms-upn", options.UserPrincipalName.Value() ? "true" : "false");
|
||||
@ -3977,7 +3978,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-if-tags", options.IfTags.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.UserPrincipalName.HasValue())
|
||||
{
|
||||
request.SetHeader("x-ms-upn", options.UserPrincipalName.Value() ? "true" : "false");
|
||||
@ -4243,7 +4244,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-if-tags", options.IfTags.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Accepted)
|
||||
@ -4261,7 +4262,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
auto request = Core::Http::Request(Core::Http::HttpMethod::Put, url);
|
||||
request.GetUrl().AppendQueryParameter("comp", "undelete");
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
(void)options;
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
@ -4280,7 +4281,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
auto request = Core::Http::Request(Core::Http::HttpMethod::Put, url);
|
||||
request.GetUrl().AppendQueryParameter("comp", "expiry");
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (!options.ExpiryOptions.ToString().empty())
|
||||
{
|
||||
request.SetHeader("x-ms-expiry-option", options.ExpiryOptions.ToString());
|
||||
@ -4368,7 +4369,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-blob-content-disposition", options.BlobContentDisposition);
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Ok)
|
||||
@ -4401,7 +4402,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
auto request = Core::Http::Request(Core::Http::HttpMethod::Put, url);
|
||||
request.GetUrl().AppendQueryParameter("comp", "immutabilityPolicies");
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.IfUnmodifiedSince.HasValue())
|
||||
{
|
||||
request.SetHeader(
|
||||
@ -4444,7 +4445,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
auto request = Core::Http::Request(Core::Http::HttpMethod::Delete, url);
|
||||
request.GetUrl().AppendQueryParameter("comp", "immutabilityPolicies");
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
(void)options;
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
@ -4464,7 +4465,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
auto request = Core::Http::Request(Core::Http::HttpMethod::Put, url);
|
||||
request.GetUrl().AppendQueryParameter("comp", "legalhold");
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
request.SetHeader("x-ms-legal-hold", options.LegalHold ? "true" : "false");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
@ -4536,7 +4537,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-if-tags", options.IfTags.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Ok)
|
||||
@ -4611,7 +4612,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-if-tags", options.IfTags.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Created)
|
||||
@ -4669,7 +4670,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-if-tags", options.IfTags.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Ok)
|
||||
@ -4726,7 +4727,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-if-tags", options.IfTags.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Ok)
|
||||
@ -4788,7 +4789,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-if-tags", options.IfTags.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Ok)
|
||||
@ -4846,7 +4847,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-if-tags", options.IfTags.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Accepted)
|
||||
@ -4926,7 +4927,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-lease-id", options.LeaseId.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Created)
|
||||
@ -5033,7 +5034,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-lease-id", options.LeaseId.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.BlobTagsString.HasValue() && !options.BlobTagsString.Value().empty())
|
||||
{
|
||||
request.SetHeader("x-ms-tags", options.BlobTagsString.Value());
|
||||
@ -5152,7 +5153,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-lease-id", options.LeaseId.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.SourceContentMD5.HasValue()
|
||||
&& !Core::Convert::Base64Encode(options.SourceContentMD5.Value()).empty())
|
||||
{
|
||||
@ -5195,6 +5196,11 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-copy-source-tag-option", options.CopySourceTags.Value().ToString());
|
||||
}
|
||||
if (options.FileRequestIntent.HasValue()
|
||||
&& !options.FileRequestIntent.Value().ToString().empty())
|
||||
{
|
||||
request.SetHeader("x-ms-file-request-intent", options.FileRequestIntent.Value().ToString());
|
||||
}
|
||||
if (options.SourceContentcrc64.HasValue()
|
||||
&& !Core::Convert::Base64Encode(options.SourceContentcrc64.Value()).empty())
|
||||
{
|
||||
@ -5262,7 +5268,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-lease-id", options.LeaseId.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::NoContent)
|
||||
@ -5300,7 +5306,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-rehydrate-priority", options.RehydratePriority.Value().ToString());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty())
|
||||
{
|
||||
request.SetHeader("x-ms-lease-id", options.LeaseId.Value());
|
||||
@ -5329,7 +5335,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url);
|
||||
request.GetUrl().AppendQueryParameter("restype", "account");
|
||||
request.GetUrl().AppendQueryParameter("comp", "properties");
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
(void)options;
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
@ -5627,7 +5633,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-if-tags", options.IfTags.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.EncryptionScope.HasValue() && !options.EncryptionScope.Value().empty())
|
||||
{
|
||||
request.SetHeader("x-ms-encryption-scope", options.EncryptionScope.Value());
|
||||
@ -5676,7 +5682,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url);
|
||||
request.GetUrl().AppendQueryParameter("comp", "tags");
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.Snapshot.HasValue() && !options.Snapshot.Value().empty())
|
||||
{
|
||||
request.GetUrl().AppendQueryParameter(
|
||||
@ -5803,7 +5809,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
request.SetHeader("Content-Type", "application/xml; charset=UTF-8");
|
||||
request.SetHeader("Content-Length", std::to_string(requestBody.Length()));
|
||||
request.GetUrl().AppendQueryParameter("comp", "tags");
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.VersionId.HasValue() && !options.VersionId.Value().empty())
|
||||
{
|
||||
request.GetUrl().AppendQueryParameter(
|
||||
@ -5934,7 +5940,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
request.SetHeader(
|
||||
"x-ms-blob-sequence-number", std::to_string(options.BlobSequenceNumber.Value()));
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.BlobTagsString.HasValue() && !options.BlobTagsString.Value().empty())
|
||||
{
|
||||
request.SetHeader("x-ms-tags", options.BlobTagsString.Value());
|
||||
@ -6080,7 +6086,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-if-tags", options.IfTags.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Created)
|
||||
@ -6206,7 +6212,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-if-tags", options.IfTags.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Created)
|
||||
@ -6349,13 +6355,18 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-source-if-none-match", options.SourceIfNoneMatch.ToString());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.CopySourceAuthorization.HasValue()
|
||||
&& !options.CopySourceAuthorization.Value().empty())
|
||||
{
|
||||
request.SetHeader(
|
||||
"x-ms-copy-source-authorization", options.CopySourceAuthorization.Value());
|
||||
}
|
||||
if (options.FileRequestIntent.HasValue()
|
||||
&& !options.FileRequestIntent.Value().ToString().empty())
|
||||
{
|
||||
request.SetHeader("x-ms-file-request-intent", options.FileRequestIntent.Value().ToString());
|
||||
}
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Created)
|
||||
@ -6450,7 +6461,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-if-tags", options.IfTags.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.Marker.HasValue() && !options.Marker.Value().empty())
|
||||
{
|
||||
request.GetUrl().AppendQueryParameter(
|
||||
@ -6628,7 +6639,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-if-tags", options.IfTags.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.Marker.HasValue() && !options.Marker.Value().empty())
|
||||
{
|
||||
request.GetUrl().AppendQueryParameter(
|
||||
@ -6808,7 +6819,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
request.SetHeader("x-ms-if-tags", options.IfTags.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-blob-content-length", std::to_string(options.BlobContentLength));
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Ok)
|
||||
@ -6874,7 +6885,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
request.SetHeader(
|
||||
"x-ms-blob-sequence-number", std::to_string(options.BlobSequenceNumber.Value()));
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Ok)
|
||||
@ -6932,7 +6943,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-copy-source", options.CopySource);
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Accepted)
|
||||
@ -7043,7 +7054,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-if-tags", options.IfTags.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.BlobTagsString.HasValue() && !options.BlobTagsString.Value().empty())
|
||||
{
|
||||
request.SetHeader("x-ms-tags", options.BlobTagsString.Value());
|
||||
@ -7171,7 +7182,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-if-tags", options.IfTags.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Created)
|
||||
@ -7325,13 +7336,18 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-source-if-none-match", options.SourceIfNoneMatch.ToString());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.CopySourceAuthorization.HasValue()
|
||||
&& !options.CopySourceAuthorization.Value().empty())
|
||||
{
|
||||
request.SetHeader(
|
||||
"x-ms-copy-source-authorization", options.CopySourceAuthorization.Value());
|
||||
}
|
||||
if (options.FileRequestIntent.HasValue()
|
||||
&& !options.FileRequestIntent.Value().ToString().empty())
|
||||
{
|
||||
request.SetHeader("x-ms-file-request-intent", options.FileRequestIntent.Value().ToString());
|
||||
}
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Created)
|
||||
@ -7381,7 +7397,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
auto request = Core::Http::Request(Core::Http::HttpMethod::Put, url);
|
||||
request.GetUrl().AppendQueryParameter("comp", "seal");
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty())
|
||||
{
|
||||
request.SetHeader("x-ms-lease-id", options.LeaseId.Value());
|
||||
@ -7520,7 +7536,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-if-tags", options.IfTags.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.BlobTagsString.HasValue() && !options.BlobTagsString.Value().empty())
|
||||
{
|
||||
request.SetHeader("x-ms-tags", options.BlobTagsString.Value());
|
||||
@ -7703,7 +7719,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-source-if-tags", options.SourceIfTags.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.SourceContentMD5.HasValue()
|
||||
&& !Core::Convert::Base64Encode(options.SourceContentMD5.Value()).empty())
|
||||
{
|
||||
@ -7735,6 +7751,11 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-copy-source-tag-option", options.CopySourceTags.Value().ToString());
|
||||
}
|
||||
if (options.FileRequestIntent.HasValue()
|
||||
&& !options.FileRequestIntent.Value().ToString().empty())
|
||||
{
|
||||
request.SetHeader("x-ms-file-request-intent", options.FileRequestIntent.Value().ToString());
|
||||
}
|
||||
if (options.SourceContentcrc64.HasValue()
|
||||
&& !Core::Convert::Base64Encode(options.SourceContentcrc64.Value()).empty())
|
||||
{
|
||||
@ -7835,7 +7856,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-encryption-scope", options.EncryptionScope.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Created)
|
||||
@ -7949,13 +7970,18 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-source-if-none-match", options.SourceIfNoneMatch.ToString());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.CopySourceAuthorization.HasValue()
|
||||
&& !options.CopySourceAuthorization.Value().empty())
|
||||
{
|
||||
request.SetHeader(
|
||||
"x-ms-copy-source-authorization", options.CopySourceAuthorization.Value());
|
||||
}
|
||||
if (options.FileRequestIntent.HasValue()
|
||||
&& !options.FileRequestIntent.Value().ToString().empty())
|
||||
{
|
||||
request.SetHeader("x-ms-file-request-intent", options.FileRequestIntent.Value().ToString());
|
||||
}
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Created)
|
||||
@ -8116,7 +8142,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-if-tags", options.IfTags.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
if (options.BlobTagsString.HasValue() && !options.BlobTagsString.Value().empty())
|
||||
{
|
||||
request.SetHeader("x-ms-tags", options.BlobTagsString.Value());
|
||||
@ -8205,7 +8231,7 @@ namespace Azure { namespace Storage { namespace Blobs {
|
||||
{
|
||||
request.SetHeader("x-ms-if-tags", options.IfTags.Value());
|
||||
}
|
||||
request.SetHeader("x-ms-version", "2024-08-04");
|
||||
request.SetHeader("x-ms-version", "2025-07-05");
|
||||
auto pRawResponse = pipeline.Send(request, context);
|
||||
auto httpStatusCode = pRawResponse->GetStatusCode();
|
||||
if (httpStatusCode != Core::Http::HttpStatusCode::Ok)
|
||||
|
||||
@ -9,7 +9,7 @@ package-name: azure-storage-blobs
|
||||
namespace: Azure::Storage::Blobs
|
||||
output-folder: generated
|
||||
clear-output-folder: true
|
||||
input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/main/specification/storage/data-plane/Microsoft.BlobStorage/stable/2024-08-04/blob.json
|
||||
input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/main/specification/storage/data-plane/Microsoft.BlobStorage/stable/2025-07-05/blob.json
|
||||
```
|
||||
|
||||
## ModelFour Options
|
||||
@ -52,12 +52,13 @@ directive:
|
||||
- from: swagger-document
|
||||
where: $["x-ms-paths"].*.*.parameters
|
||||
transform: >
|
||||
$ = $.filter(p => !(p["$ref"] && (p["$ref"].endsWith("#/parameters/Timeout") || p["$ref"].endsWith("#/parameters/ClientRequestId"))));
|
||||
$ = $.filter(p => !(p["$ref"] && (p["$ref"].endsWith("#/parameters/Timeout") || p["$ref"].endsWith("#/parameters/ClientRequestId")
|
||||
|| p["$ref"].endsWith("#/parameters/StructuredBodyGet") || p["$ref"].endsWith("#/parameters/StructuredBodyPut") || p["$ref"].endsWith("#/parameters/StructuredContentLength"))));
|
||||
- from: swagger-document
|
||||
where: $["x-ms-paths"].*.*.responses.*.headers
|
||||
transform: >
|
||||
for (const h in $) {
|
||||
if (["x-ms-client-request-id", "x-ms-request-id", "x-ms-version", "Date"].includes(h)) {
|
||||
if (["x-ms-client-request-id", "x-ms-request-id", "x-ms-version", "Date", "x-ms-structured-body", "x-ms-structured-content-length"].includes(h)) {
|
||||
delete $[h];
|
||||
}
|
||||
}
|
||||
@ -100,12 +101,12 @@ directive:
|
||||
"name": "ApiVersion",
|
||||
"modelAsString": false
|
||||
},
|
||||
"enum": ["2024-08-04"]
|
||||
"enum": ["2025-07-05"]
|
||||
};
|
||||
- from: swagger-document
|
||||
where: $.parameters
|
||||
transform: >
|
||||
$.ApiVersionParameter.enum[0] = "2024-08-04";
|
||||
$.ApiVersionParameter.enum[0] = "2025-07-05";
|
||||
```
|
||||
|
||||
### Rename Operations
|
||||
@ -293,6 +294,7 @@ directive:
|
||||
$.ImmutabilityPolicyMode.enum = $.ImmutabilityPolicyMode.enum.map(e => e.toLowerCase());
|
||||
$.CopySourceTags["x-ms-enum"]["name"] = "BlobCopySourceTagsMode";
|
||||
delete $.FilterBlobsInclude;
|
||||
$.FileRequestIntent["x-ms-enum"]["values"] = [{"value": "__placeHolder", "name": "__placeHolder"}, {"value": "backup", "name": "Backup"}];
|
||||
- from: swagger-document
|
||||
where: $.definitions
|
||||
transform: >
|
||||
|
||||
@ -49,7 +49,7 @@ create_map_file(azure-storage-blobs-test azure-storage-blobs-test.map)
|
||||
# Include shared test headers
|
||||
target_include_directories(azure-storage-blobs-test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../../azure-storage-common)
|
||||
|
||||
target_link_libraries(azure-storage-blobs-test PRIVATE azure-identity azure-storage-blobs azure-core-test-fw gtest gtest_main gmock)
|
||||
target_link_libraries(azure-storage-blobs-test PRIVATE azure-identity azure-storage-blobs azure-storage-files-shares azure-core-test-fw gtest gtest_main gmock)
|
||||
|
||||
# gtest_discover_tests will scan the test from azure-storage-blobs-test and call add_test
|
||||
# for each test to ctest. This enables `ctest -r` to run specific tests directly.
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
#include <azure/core/cryptography/hash.hpp>
|
||||
#include <azure/storage/blobs/blob_lease_client.hpp>
|
||||
#include <azure/storage/common/crypt.hpp>
|
||||
#include <azure/storage/files/shares.hpp>
|
||||
|
||||
namespace Azure { namespace Storage { namespace Blobs { namespace Models {
|
||||
|
||||
@ -467,4 +468,39 @@ namespace Azure { namespace Storage { namespace Test {
|
||||
EXPECT_EQ(blobContent.size(), properties.BlobSize);
|
||||
}
|
||||
|
||||
TEST_F(AppendBlobClientTest, OAuthAppendBlockFromUri_SourceFileShare_PLAYBACKONLY_)
|
||||
{
|
||||
auto shareClientOptions = InitStorageClientOptions<Files::Shares::ShareClientOptions>();
|
||||
shareClientOptions.ShareTokenIntent = Files::Shares::Models::ShareTokenIntent::Backup;
|
||||
auto oauthCredential = GetTestCredential();
|
||||
auto shareServiceClient = Files::Shares::ShareServiceClient::CreateFromConnectionString(
|
||||
StandardStorageConnectionString(), shareClientOptions);
|
||||
shareServiceClient = Files::Shares::ShareServiceClient(
|
||||
shareServiceClient.GetUrl(), oauthCredential, shareClientOptions);
|
||||
auto shareClient = shareServiceClient.GetShareClient(LowercaseRandomString());
|
||||
shareClient.Create();
|
||||
|
||||
size_t fileSize = 1 * 1024;
|
||||
std::string fileName = RandomString() + "file";
|
||||
std::vector<uint8_t> fileContent = RandomBuffer(fileSize);
|
||||
auto memBodyStream = Core::IO::MemoryBodyStream(fileContent);
|
||||
auto sourceFileClient = shareClient.GetRootDirectoryClient().GetFileClient(fileName);
|
||||
sourceFileClient.Create(fileSize);
|
||||
EXPECT_NO_THROW(sourceFileClient.UploadRange(0, memBodyStream));
|
||||
|
||||
Azure::Core::Credentials::TokenRequestContext requestContext;
|
||||
requestContext.Scopes = {Storage::_internal::StorageScope};
|
||||
|
||||
auto oauthToken = oauthCredential->GetToken(requestContext, Azure::Core::Context());
|
||||
|
||||
auto destBlobClient = GetAppendBlobClientForTest(RandomString());
|
||||
EXPECT_NO_THROW(destBlobClient.Create());
|
||||
Storage::Blobs::AppendBlockFromUriOptions options;
|
||||
options.SourceAuthorization = "Bearer " + oauthToken.Token;
|
||||
options.FileRequestIntent = Blobs::Models::FileShareTokenIntent::Backup;
|
||||
EXPECT_NO_THROW(destBlobClient.AppendBlockFromUri(sourceFileClient.GetUrl(), options));
|
||||
|
||||
EXPECT_NO_THROW(shareClient.DeleteIfExists());
|
||||
}
|
||||
|
||||
}}} // namespace Azure::Storage::Test
|
||||
|
||||
@ -508,6 +508,24 @@ namespace Azure { namespace Storage { namespace Test {
|
||||
containerClient.DeleteIfExists();
|
||||
}
|
||||
|
||||
TEST_F(BlobContainerClientTest, AclAndAccountInfoOAuth_PLAYBACKONLY_)
|
||||
{
|
||||
auto credential = GetTestCredential();
|
||||
auto clientOptions = InitStorageClientOptions<Blobs::BlobClientOptions>();
|
||||
auto containerClient
|
||||
= Blobs::BlobContainerClient(m_blobContainerClient->GetUrl(), credential, clientOptions);
|
||||
|
||||
Blobs::SetBlobContainerAccessPolicyOptions options;
|
||||
auto ret = containerClient.SetAccessPolicy(options);
|
||||
EXPECT_TRUE(ret.Value.ETag.HasValue());
|
||||
EXPECT_TRUE(IsValidTime(ret.Value.LastModified));
|
||||
|
||||
EXPECT_NO_THROW(containerClient.GetAccessPolicy());
|
||||
|
||||
auto ret3 = containerClient.GetAccountInfo();
|
||||
EXPECT_FALSE(ret3.Value.IsHierarchicalNamespaceEnabled);
|
||||
}
|
||||
|
||||
TEST_F(BlobContainerClientTest, Lease)
|
||||
{
|
||||
auto containerClient = *m_blobContainerClient;
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
|
||||
#include <azure/core/cryptography/hash.hpp>
|
||||
#include <azure/storage/common/crypt.hpp>
|
||||
#include <azure/storage/files/shares.hpp>
|
||||
|
||||
#include <future>
|
||||
#include <random>
|
||||
@ -491,6 +492,87 @@ namespace Azure { namespace Storage { namespace Test {
|
||||
EXPECT_FALSE(blobItem.Details.IncrementalCopyDestinationSnapshot.HasValue());
|
||||
}
|
||||
|
||||
TEST_F(BlockBlobClientTest, OAuthCopyFromUri_SourceFileShare_PLAYBACKONLY_)
|
||||
{
|
||||
auto shareClientOptions = InitStorageClientOptions<Files::Shares::ShareClientOptions>();
|
||||
shareClientOptions.ShareTokenIntent = Files::Shares::Models::ShareTokenIntent::Backup;
|
||||
auto oauthCredential = GetTestCredential();
|
||||
auto shareServiceClient = Files::Shares::ShareServiceClient::CreateFromConnectionString(
|
||||
StandardStorageConnectionString(), shareClientOptions);
|
||||
shareServiceClient = Files::Shares::ShareServiceClient(
|
||||
shareServiceClient.GetUrl(), oauthCredential, shareClientOptions);
|
||||
auto shareClient = shareServiceClient.GetShareClient(LowercaseRandomString());
|
||||
shareClient.Create();
|
||||
|
||||
size_t fileSize = 1 * 1024;
|
||||
std::string fileName = RandomString() + "file";
|
||||
std::vector<uint8_t> fileContent = RandomBuffer(fileSize);
|
||||
auto memBodyStream = Core::IO::MemoryBodyStream(fileContent);
|
||||
auto sourceFileClient = shareClient.GetRootDirectoryClient().GetFileClient(fileName);
|
||||
sourceFileClient.Create(fileSize);
|
||||
EXPECT_NO_THROW(sourceFileClient.UploadRange(0, memBodyStream));
|
||||
|
||||
Azure::Core::Credentials::TokenRequestContext requestContext;
|
||||
requestContext.Scopes = {Storage::_internal::StorageScope};
|
||||
auto oauthToken = oauthCredential->GetToken(requestContext, Azure::Core::Context());
|
||||
|
||||
const std::string blobName = "dest" + RandomString();
|
||||
auto destBlobClient = m_blobContainerClient->GetBlockBlobClient(blobName);
|
||||
|
||||
// Copy From Uri
|
||||
Storage::Blobs::CopyBlobFromUriOptions copyOptions;
|
||||
copyOptions.SourceAuthorization = "Bearer " + oauthToken.Token;
|
||||
copyOptions.FileRequestIntent = Azure::Storage::Blobs::Models::FileShareTokenIntent::Backup;
|
||||
auto res = destBlobClient.CopyFromUri(sourceFileClient.GetUrl(), copyOptions);
|
||||
EXPECT_EQ(res.RawResponse->GetStatusCode(), Azure::Core::Http::HttpStatusCode::Accepted);
|
||||
EXPECT_TRUE(res.Value.ETag.HasValue());
|
||||
EXPECT_TRUE(IsValidTime(res.Value.LastModified));
|
||||
EXPECT_FALSE(res.Value.CopyId.empty());
|
||||
EXPECT_EQ(res.Value.CopyStatus, Azure::Storage::Blobs::Models::CopyStatus::Success);
|
||||
|
||||
auto downloadResult = destBlobClient.Download();
|
||||
EXPECT_FALSE(downloadResult.Value.Details.CopyId.Value().empty());
|
||||
EXPECT_FALSE(downloadResult.Value.Details.CopySource.Value().empty());
|
||||
EXPECT_TRUE(
|
||||
downloadResult.Value.Details.CopyStatus.Value()
|
||||
== Azure::Storage::Blobs::Models::CopyStatus::Success);
|
||||
EXPECT_FALSE(downloadResult.Value.Details.CopyProgress.Value().empty());
|
||||
EXPECT_TRUE(IsValidTime(downloadResult.Value.Details.CopyCompletedOn.Value()));
|
||||
|
||||
auto blobItem = GetBlobItem(blobName, Blobs::Models::ListBlobsIncludeFlags::Copy);
|
||||
EXPECT_FALSE(blobItem.Details.CopyId.Value().empty());
|
||||
EXPECT_FALSE(blobItem.Details.CopySource.Value().empty());
|
||||
EXPECT_TRUE(
|
||||
blobItem.Details.CopyStatus.Value() == Azure::Storage::Blobs::Models::CopyStatus::Success);
|
||||
EXPECT_FALSE(blobItem.Details.CopyProgress.Value().empty());
|
||||
EXPECT_TRUE(IsValidTime(blobItem.Details.CopyCompletedOn.Value()));
|
||||
ASSERT_TRUE(blobItem.Details.IsIncrementalCopy.HasValue());
|
||||
EXPECT_FALSE(blobItem.Details.IsIncrementalCopy.Value());
|
||||
EXPECT_FALSE(blobItem.Details.IncrementalCopyDestinationSnapshot.HasValue());
|
||||
|
||||
// Upload From Uri
|
||||
Storage::Blobs::UploadBlockBlobFromUriOptions uploadOptions;
|
||||
uploadOptions.SourceAuthorization = "Bearer " + oauthToken.Token;
|
||||
uploadOptions.FileRequestIntent = Azure::Storage::Blobs::Models::FileShareTokenIntent::Backup;
|
||||
EXPECT_NO_THROW(destBlobClient.UploadFromUri(sourceFileClient.GetUrl(), uploadOptions));
|
||||
|
||||
// Stage Block From Uri
|
||||
const std::string blockId1 = Base64EncodeText("0");
|
||||
const std::string blobName2 = "dest2" + RandomString();
|
||||
auto destBlobClient2 = m_blobContainerClient->GetBlockBlobClient(blobName2);
|
||||
|
||||
Storage::Blobs::StageBlockFromUriOptions stageBlockOptions;
|
||||
stageBlockOptions.SourceAuthorization = "Bearer " + oauthToken.Token;
|
||||
stageBlockOptions.FileRequestIntent
|
||||
= Azure::Storage::Blobs::Models::FileShareTokenIntent::Backup;
|
||||
EXPECT_NO_THROW(
|
||||
destBlobClient2.StageBlockFromUri(blockId1, sourceFileClient.GetUrl(), stageBlockOptions));
|
||||
|
||||
EXPECT_NO_THROW(destBlobClient2.CommitBlockList({blockId1}));
|
||||
|
||||
EXPECT_NO_THROW(shareClient.DeleteIfExists());
|
||||
}
|
||||
|
||||
TEST_F(BlockBlobClientTest, SyncCopyFromUriEncryptionScope)
|
||||
{
|
||||
Blobs::BlobClientOptions clientOptions;
|
||||
|
||||
@ -7,6 +7,7 @@
|
||||
#include <azure/storage/blobs/blob_lease_client.hpp>
|
||||
#include <azure/storage/common/crypt.hpp>
|
||||
#include <azure/storage/common/internal/file_io.hpp>
|
||||
#include <azure/storage/files/shares.hpp>
|
||||
|
||||
#include <future>
|
||||
#include <vector>
|
||||
@ -301,6 +302,43 @@ namespace Azure { namespace Storage { namespace Test {
|
||||
pageBlobClient.Download().Value.BodyStream->ReadToEnd());
|
||||
}
|
||||
|
||||
TEST_F(PageBlobClientTest, OAuthUploadFromUri_SourceFileShare_PLAYBACKONLY_)
|
||||
{
|
||||
auto shareClientOptions = InitStorageClientOptions<Files::Shares::ShareClientOptions>();
|
||||
shareClientOptions.ShareTokenIntent = Files::Shares::Models::ShareTokenIntent::Backup;
|
||||
auto oauthCredential = GetTestCredential();
|
||||
auto shareServiceClient = Files::Shares::ShareServiceClient::CreateFromConnectionString(
|
||||
StandardStorageConnectionString(), shareClientOptions);
|
||||
shareServiceClient = Files::Shares::ShareServiceClient(
|
||||
shareServiceClient.GetUrl(), oauthCredential, shareClientOptions);
|
||||
auto shareClient = shareServiceClient.GetShareClient(LowercaseRandomString());
|
||||
shareClient.Create();
|
||||
|
||||
size_t fileSize = 1 * 1024;
|
||||
std::string fileName = RandomString() + "file";
|
||||
std::vector<uint8_t> fileContent = RandomBuffer(fileSize);
|
||||
auto memBodyStream = Core::IO::MemoryBodyStream(fileContent);
|
||||
auto sourceFileClient = shareClient.GetRootDirectoryClient().GetFileClient(fileName);
|
||||
sourceFileClient.Create(fileSize);
|
||||
EXPECT_NO_THROW(sourceFileClient.UploadRange(0, memBodyStream));
|
||||
|
||||
auto destBlobClient = GetPageBlobClientTestForTest(RandomString());
|
||||
destBlobClient.Create(fileSize);
|
||||
|
||||
Azure::Core::Credentials::TokenRequestContext requestContext;
|
||||
requestContext.Scopes = {Storage::_internal::StorageScope};
|
||||
auto oauthToken = oauthCredential->GetToken(requestContext, Azure::Core::Context());
|
||||
|
||||
Storage::Blobs::UploadPagesFromUriOptions options;
|
||||
options.SourceAuthorization = "Bearer " + oauthToken.Token;
|
||||
options.FileRequestIntent = Blobs::Models::FileShareTokenIntent::Backup;
|
||||
EXPECT_NO_THROW(destBlobClient.UploadPagesFromUri(
|
||||
0, sourceFileClient.GetUrl(), {0, static_cast<int64_t>(fileSize)}, options));
|
||||
EXPECT_EQ(destBlobClient.Download().Value.BodyStream->ReadToEnd(), fileContent);
|
||||
|
||||
EXPECT_NO_THROW(shareClient.DeleteIfExists());
|
||||
}
|
||||
|
||||
TEST_F(PageBlobClientTest, StartCopyIncremental_LIVEONLY_)
|
||||
{
|
||||
auto pageBlobClient = *m_pageBlobClient;
|
||||
|
||||
@ -714,6 +714,21 @@ namespace Azure { namespace Storage { namespace Test {
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(DataLakeFileSystemClientTest, AclOAuth_PLAYBACKONLY_)
|
||||
{
|
||||
auto credential = GetTestCredential();
|
||||
auto clientOptions = InitStorageClientOptions<Files::DataLake::DataLakeClientOptions>();
|
||||
auto fileSystemClient = Files::DataLake::DataLakeFileSystemClient(
|
||||
m_fileSystemClient->GetUrl(), credential, clientOptions);
|
||||
|
||||
Files::DataLake::SetFileSystemAccessPolicyOptions options;
|
||||
auto ret = fileSystemClient.SetAccessPolicy(options);
|
||||
EXPECT_TRUE(ret.Value.ETag.HasValue());
|
||||
EXPECT_TRUE(IsValidTime(ret.Value.LastModified));
|
||||
|
||||
EXPECT_NO_THROW(fileSystemClient.GetAccessPolicy());
|
||||
}
|
||||
|
||||
TEST_F(DataLakeFileSystemClientTest, RenameFile)
|
||||
{
|
||||
const std::string oldFilename = RandomString() + "1";
|
||||
|
||||
@ -379,6 +379,30 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
|
||||
const UploadFileRangeFromUriOptions& options = UploadFileRangeFromUriOptions(),
|
||||
const Azure::Core::Context& context = Azure::Core::Context()) const;
|
||||
|
||||
/**
|
||||
* @brief NFS only. Creates a symbolic link to the file specified by path.
|
||||
* @param linkText The absolution or relative path to the file to be linked to.
|
||||
* @param options Optional parameters to create this file's symbolic link.
|
||||
* @param context Context for cancelling long running operations.
|
||||
* @return Azure::Response<Models::CreateFileSymbolicLinkResult> containing the returned
|
||||
* information.
|
||||
*/
|
||||
Azure::Response<Models::CreateFileSymbolicLinkResult> CreateSymbolicLink(
|
||||
const std::string& linkText,
|
||||
const CreateSymbolicLinkOptions& options = CreateSymbolicLinkOptions(),
|
||||
const Azure::Core::Context& context = Azure::Core::Context()) const;
|
||||
|
||||
/**
|
||||
* @brief NFS only. Reads the value of the symbolic link.
|
||||
* @param options Optional parameters to get this file's symbolic link.
|
||||
* @param context Context for cancelling long running operations.
|
||||
* @return Azure::Response<Models::GetFileSymbolicLinkResult> containing the returned
|
||||
* information.
|
||||
*/
|
||||
Azure::Response<Models::GetFileSymbolicLinkResult> GetSymbolicLink(
|
||||
const GetSymbolicLinkOptions& options = GetSymbolicLinkOptions(),
|
||||
const Azure::Core::Context& context = Azure::Core::Context()) const;
|
||||
|
||||
/**
|
||||
* @brief NFS only. Creates a hard link to the file specified by path.
|
||||
* @param targetFile Path of the file to create the hard link to, not including the share.
|
||||
|
||||
@ -1387,6 +1387,53 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
|
||||
{
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Optional parameters for
|
||||
* #Azure::Storage::Files::Shares::ShareFileClient::CreateSymbolicLink.
|
||||
*/
|
||||
struct CreateSymbolicLinkOptions final
|
||||
{
|
||||
/**
|
||||
* A name-value pair to associate with a file storage object.
|
||||
*/
|
||||
Storage::Metadata Metadata;
|
||||
|
||||
/**
|
||||
* Creation time for the file or directory.
|
||||
*/
|
||||
Nullable<DateTime> CreatedOn;
|
||||
|
||||
/**
|
||||
* Last write time for the file or directory.
|
||||
*/
|
||||
Nullable<DateTime> LastWrittenOn;
|
||||
|
||||
/**
|
||||
* Specify the access condition for the path.
|
||||
*/
|
||||
LeaseAccessConditions AccessConditions;
|
||||
|
||||
/**
|
||||
* NFS only. The owner user identifier (UID) to be set on the symbolic link. The default value
|
||||
* is 0 (root).
|
||||
*/
|
||||
Nullable<std::string> Owner;
|
||||
|
||||
/**
|
||||
* NFS only. The owner group identifier (GID) to be set on the symbolic link. The default value
|
||||
* is 0 (root group).
|
||||
*/
|
||||
Nullable<std::string> Group;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Optional parameters for
|
||||
* #Azure::Storage::Files::Shares::ShareFileClient::GetSymbolicLink.
|
||||
*/
|
||||
struct GetSymbolicLinkOptions final
|
||||
{
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Optional parameters for
|
||||
* #Azure::Storage::Files::Shares::ShareFileClient::CreateHardLink.
|
||||
|
||||
@ -591,6 +591,57 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
|
||||
FilePosixProperties PosixProperties;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Response type for #Azure::Storage::Files::Shares::ShareFileClient::CreateSymbolicLink.
|
||||
*/
|
||||
struct CreateFileSymbolicLinkResult final
|
||||
{
|
||||
/**
|
||||
* The ETag contains a value which represents the version of the file, in quotes.
|
||||
*/
|
||||
Azure::ETag ETag;
|
||||
|
||||
/**
|
||||
* Returns the date and time the share was last modified. Any operation that modifies the
|
||||
* directory or its properties updates the last modified time. Operations on files do not
|
||||
* affect the last modified time of the directory.
|
||||
*/
|
||||
DateTime LastModified;
|
||||
|
||||
/**
|
||||
* The SMB related properties for the file.
|
||||
*/
|
||||
FileSmbProperties SmbProperties;
|
||||
|
||||
/**
|
||||
* The NFS related properties for the file.
|
||||
*/
|
||||
FilePosixProperties PosixProperties;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Response type for #Azure::Storage::Files::Shares::ShareFileClient::GetSymbolicLink.
|
||||
*/
|
||||
struct GetFileSymbolicLinkResult final
|
||||
{
|
||||
/**
|
||||
* The ETag contains a value which represents the version of the file, in quotes.
|
||||
*/
|
||||
Azure::ETag ETag;
|
||||
/**
|
||||
* Returns the date and time the share was last modified. Any operation that modifies the
|
||||
* directory or its properties updates the last modified time. Operations on files do not
|
||||
* affect the last modified time of the directory.
|
||||
*/
|
||||
DateTime LastModified;
|
||||
/**
|
||||
* The path to the original file, the symbolic link is pointing to. The path is of type
|
||||
* string which is not resolved and is stored as is. The path can be absolute path or the
|
||||
* relative path depending on the content stored in the symbolic link file.
|
||||
*/
|
||||
std::string LinkText;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Response type for #Azure::Storage::Files::Shares::ShareFileClient::CreateHardLink.
|
||||
*/
|
||||
|
||||
@ -1434,6 +1434,65 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
|
||||
*m_pipeline, m_shareFileUrl, protocolLayerOptions, context);
|
||||
}
|
||||
|
||||
Azure::Response<Models::CreateFileSymbolicLinkResult> ShareFileClient::CreateSymbolicLink(
|
||||
const std::string& linkText,
|
||||
const CreateSymbolicLinkOptions& options,
|
||||
const Azure::Core::Context& context) const
|
||||
{
|
||||
_detail::FileClient::CreateFileSymbolicLinkOptions protocolLayerOptions;
|
||||
protocolLayerOptions.LinkText = linkText;
|
||||
if (options.CreatedOn.HasValue())
|
||||
{
|
||||
protocolLayerOptions.FileCreationTime = options.CreatedOn.Value().ToString(
|
||||
Azure::DateTime::DateFormat::Rfc3339, DateTime::TimeFractionFormat::AllDigits);
|
||||
}
|
||||
|
||||
if (options.LastWrittenOn.HasValue())
|
||||
{
|
||||
protocolLayerOptions.FileLastWriteTime = options.LastWrittenOn.Value().ToString(
|
||||
Azure::DateTime::DateFormat::Rfc3339, DateTime::TimeFractionFormat::AllDigits);
|
||||
}
|
||||
|
||||
protocolLayerOptions.FileRequestIntent = m_shareTokenIntent;
|
||||
protocolLayerOptions.Owner = options.Owner;
|
||||
protocolLayerOptions.Group = options.Group;
|
||||
protocolLayerOptions.Metadata
|
||||
= std::map<std::string, std::string>(options.Metadata.begin(), options.Metadata.end());
|
||||
protocolLayerOptions.LeaseId = options.AccessConditions.LeaseId;
|
||||
|
||||
auto response = _detail::FileClient::CreateSymbolicLink(
|
||||
*m_pipeline, m_shareFileUrl, protocolLayerOptions, context);
|
||||
|
||||
Models::CreateFileSymbolicLinkResult ret;
|
||||
ret.ETag = std::move(response.Value.ETag);
|
||||
ret.SmbProperties = std::move(response.Value.SmbProperties);
|
||||
ret.LastModified = std::move(response.Value.LastModified);
|
||||
ret.PosixProperties.FileMode = Models::NfsFileMode::ParseOctalFileMode(response.Value.FileMode);
|
||||
ret.PosixProperties.Owner = std::move(response.Value.Owner);
|
||||
ret.PosixProperties.Group = std::move(response.Value.Group);
|
||||
ret.PosixProperties.NfsFileType = std::move(response.Value.NfsFileType);
|
||||
return Azure::Response<Models::CreateFileSymbolicLinkResult>(
|
||||
std::move(ret), std::move(response.RawResponse));
|
||||
}
|
||||
|
||||
Azure::Response<Models::GetFileSymbolicLinkResult> ShareFileClient::GetSymbolicLink(
|
||||
const GetSymbolicLinkOptions& options,
|
||||
const Azure::Core::Context& context) const
|
||||
{
|
||||
(void)options;
|
||||
_detail::FileClient::GetFileSymbolicLinkOptions protocolLayerOptions;
|
||||
protocolLayerOptions.FileRequestIntent = m_shareTokenIntent;
|
||||
auto response = _detail::FileClient::GetSymbolicLink(
|
||||
*m_pipeline, m_shareFileUrl, protocolLayerOptions, context);
|
||||
|
||||
Models::GetFileSymbolicLinkResult ret;
|
||||
ret.ETag = std::move(response.Value.ETag);
|
||||
ret.LastModified = std::move(response.Value.LastModified);
|
||||
ret.LinkText = std::move(response.Value.LinkText);
|
||||
return Azure::Response<Models::GetFileSymbolicLinkResult>(
|
||||
std::move(ret), std::move(response.RawResponse));
|
||||
}
|
||||
|
||||
Azure::Response<Models::CreateFileHardLinkResult> ShareFileClient::CreateHardLink(
|
||||
const std::string& targetFile,
|
||||
const CreateHardLinkOptions& options,
|
||||
|
||||
@ -2211,7 +2211,7 @@ namespace Azure { namespace Storage { namespace Test {
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(FileShareFileClientTest, PremiumNfsProperties_PLAYBACKONLY_)
|
||||
TEST_F(FileShareFileClientTest, PremiumPosixProperties_PLAYBACKONLY_)
|
||||
{
|
||||
auto shareServiceClient = *m_premiumShareServiceClient;
|
||||
|
||||
@ -2332,6 +2332,56 @@ namespace Azure { namespace Storage { namespace Test {
|
||||
setOptions.PosixProperties.Owner.Value());
|
||||
EXPECT_TRUE(downloadToResult.Details.PosixProperties.LinkCount.HasValue());
|
||||
|
||||
// Create SymbolicLink
|
||||
std::string sourceUrl = fileClient.GetUrl();
|
||||
auto symbolicLinkClient
|
||||
= shareClient.GetRootDirectoryClient().GetFileClient(LowercaseRandomString());
|
||||
Files::Shares::CreateSymbolicLinkOptions createSymbolicLinkOptions;
|
||||
createSymbolicLinkOptions.CreatedOn = otherProperties.SmbProperties.CreatedOn;
|
||||
createSymbolicLinkOptions.LastWrittenOn = otherProperties.SmbProperties.LastWrittenOn;
|
||||
|
||||
createSymbolicLinkOptions.Metadata = RandomMetadata();
|
||||
createSymbolicLinkOptions.Group = "123";
|
||||
createSymbolicLinkOptions.Owner = "456";
|
||||
Files::Shares::Models::CreateFileSymbolicLinkResult createSymbolicLinkResult;
|
||||
EXPECT_NO_THROW(
|
||||
createSymbolicLinkResult
|
||||
= symbolicLinkClient.CreateSymbolicLink(sourceUrl, createSymbolicLinkOptions).Value);
|
||||
EXPECT_TRUE(createSymbolicLinkResult.PosixProperties.FileMode.HasValue());
|
||||
EXPECT_EQ(
|
||||
createSymbolicLinkResult.PosixProperties.FileMode.Value().ToOctalFileMode(), octalMode);
|
||||
EXPECT_TRUE(createSymbolicLinkResult.PosixProperties.Group.HasValue());
|
||||
EXPECT_EQ(
|
||||
createSymbolicLinkResult.PosixProperties.Group.Value(),
|
||||
createSymbolicLinkOptions.Group.Value());
|
||||
EXPECT_TRUE(createSymbolicLinkResult.PosixProperties.FileMode.HasValue());
|
||||
EXPECT_EQ(
|
||||
createSymbolicLinkResult.PosixProperties.Owner.Value(),
|
||||
createSymbolicLinkOptions.Owner.Value());
|
||||
EXPECT_TRUE(createSymbolicLinkResult.PosixProperties.NfsFileType.HasValue());
|
||||
EXPECT_EQ(
|
||||
createSymbolicLinkResult.PosixProperties.NfsFileType.Value(),
|
||||
Files::Shares::Models::NfsFileType::SymLink);
|
||||
EXPECT_EQ(
|
||||
createSymbolicLinkResult.SmbProperties.CreatedOn.Value(),
|
||||
createSymbolicLinkOptions.CreatedOn.Value());
|
||||
EXPECT_EQ(
|
||||
createSymbolicLinkResult.SmbProperties.LastWrittenOn.Value(),
|
||||
createSymbolicLinkOptions.LastWrittenOn.Value());
|
||||
EXPECT_TRUE(createSymbolicLinkResult.SmbProperties.ChangedOn.HasValue());
|
||||
EXPECT_TRUE(!createSymbolicLinkResult.SmbProperties.FileId.empty());
|
||||
EXPECT_TRUE(!createSymbolicLinkResult.SmbProperties.ParentFileId.empty());
|
||||
EXPECT_TRUE(createSymbolicLinkResult.ETag.HasValue());
|
||||
|
||||
// Get SymbolicLink
|
||||
Files::Shares::Models::GetFileSymbolicLinkResult getSymbolicLinkResult;
|
||||
EXPECT_NO_THROW(getSymbolicLinkResult = symbolicLinkClient.GetSymbolicLink().Value);
|
||||
EXPECT_TRUE(getSymbolicLinkResult.ETag.HasValue());
|
||||
if (!m_testContext.IsPlaybackMode())
|
||||
{
|
||||
EXPECT_EQ(Azure::Core::Url::Decode(getSymbolicLinkResult.LinkText), sourceUrl);
|
||||
}
|
||||
|
||||
// Create HardLink
|
||||
auto hardLinkClient
|
||||
= shareClient.GetRootDirectoryClient().GetFileClient(LowercaseRandomString());
|
||||
@ -2417,7 +2467,7 @@ namespace Azure { namespace Storage { namespace Test {
|
||||
Files::Shares::Models::NfsFileType::Regular);
|
||||
}
|
||||
|
||||
TEST_F(FileShareFileClientTest, PremiumNfsPropertiesForCopy_PLAYBACKONLY_)
|
||||
TEST_F(FileShareFileClientTest, PremiumPosixPropertiesForCopy_PLAYBACKONLY_)
|
||||
{
|
||||
auto shareServiceClient = *m_premiumShareServiceClient;
|
||||
|
||||
@ -2509,7 +2559,7 @@ namespace Azure { namespace Storage { namespace Test {
|
||||
EXPECT_EQ(
|
||||
properties.PosixProperties.Owner.Value(), createOptions.PosixProperties.Owner.Value());
|
||||
|
||||
// Copy without NfsProperties
|
||||
// Copy without PosixProperties
|
||||
copyOptions = Files::Shares::StartFileCopyOptions();
|
||||
copyOptions.SmbPropertiesToCopy = Files::Shares::CopyableFileSmbPropertyFlags::None;
|
||||
destFileClient = shareClient.GetRootDirectoryClient().GetFileClient(LowercaseRandomString());
|
||||
|
||||
@ -235,6 +235,18 @@ namespace Azure { namespace Storage { namespace Test {
|
||||
queueClient.Delete();
|
||||
}
|
||||
|
||||
TEST_F(QueueClientTest, AclOAuth_PLAYBACKONLY_)
|
||||
{
|
||||
auto credential = GetTestCredential();
|
||||
auto clientOptions = InitStorageClientOptions<Queues::QueueClientOptions>();
|
||||
auto queueClient = Queues::QueueClient(m_queueClient->GetUrl(), credential, clientOptions);
|
||||
|
||||
Queues::Models::QueueAccessPolicy accessPolicy;
|
||||
EXPECT_NO_THROW(queueClient.SetAccessPolicy(accessPolicy));
|
||||
|
||||
EXPECT_NO_THROW(queueClient.GetAccessPolicy());
|
||||
}
|
||||
|
||||
TEST_F(QueueClientTest, Audience)
|
||||
{
|
||||
auto credential = GetTestCredential();
|
||||
|
||||
Loading…
Reference in New Issue
Block a user