Add batch protocol layer (#3580)

* Add batch protocol layer
This commit is contained in:
JinmingHu 2022-04-26 08:58:20 +08:00 committed by GitHub
parent d799012230
commit 87b230a51d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 118 additions and 3 deletions

View File

@ -4,6 +4,8 @@
### Features Added
- Add `Azure::Core::Http::Request` constructor overload to support payload and non-buffered response.
### Breaking Changes
### Bugs Fixed

View File

@ -209,6 +209,7 @@ namespace Azure { namespace Core { namespace Http {
// previously called
void StartTry();
public:
/**
* @brief Construct an #Azure::Core::Http::Request.
*
@ -229,7 +230,6 @@ namespace Azure { namespace Core { namespace Http {
AZURE_ASSERT_MSG(bodyStream, "The bodyStream pointer cannot be null.");
}
public:
/**
* @brief Constructs a `%Request`.
*

View File

@ -807,6 +807,18 @@ namespace Azure { namespace Storage { namespace Blobs {
struct RenameBlobContainerResult final
{
};
/**
* @brief Response type for #Azure::Storage::Blobs::BlobContainerClient::SubmitBatch.
*/
struct SubmitBatchResult final
{
std::unique_ptr<Core::IO::BodyStream> BodyStream;
/**
* The media type of the body of the response. For batch requests, this is multipart/mixed;
* boundary=batchresponse_GUID.
*/
std::string ContentType;
};
/**
* @brief Response type for #Azure::Storage::Blobs::BlobContainerClient::AcquireLease.
*/
@ -2971,6 +2983,16 @@ namespace Azure { namespace Storage { namespace Blobs {
const Core::Url& url,
const GetServiceAccountInfoOptions& options,
const Core::Context& context);
struct SubmitServiceBatchOptions final
{
std::string MultipartContentType;
};
static Response<Models::_detail::SubmitBatchResult> SubmitBatch(
Core::Http::_internal::HttpPipeline& pipeline,
const Core::Url& url,
Core::IO::BodyStream& requestBody,
const SubmitServiceBatchOptions& options,
const Core::Context& context);
struct FindServiceBlobsByTagsOptions final
{
Nullable<std::string> Where;
@ -3070,6 +3092,16 @@ namespace Azure { namespace Storage { namespace Blobs {
const Core::Url& url,
const RenameBlobContainerOptions& options,
const Core::Context& context);
struct SubmitBlobContainerBatchOptions final
{
std::string MultipartContentType;
};
static Response<Models::_detail::SubmitBatchResult> SubmitBatch(
Core::Http::_internal::HttpPipeline& pipeline,
const Core::Url& url,
Core::IO::BodyStream& requestBody,
const SubmitBlobContainerBatchOptions& options,
const Core::Context& context);
struct AcquireBlobContainerLeaseOptions final
{
Nullable<int32_t> Duration;

View File

@ -1188,6 +1188,33 @@ namespace Azure { namespace Storage { namespace Blobs {
= pRawResponse->GetHeaders().at("x-ms-is-hns-enabled") == std::string("true");
return Response<Models::AccountInfo>(std::move(response), std::move(pRawResponse));
}
Response<Models::_detail::SubmitBatchResult> ServiceClient::SubmitBatch(
Core::Http::_internal::HttpPipeline& pipeline,
const Core::Url& url,
Core::IO::BodyStream& requestBody,
const SubmitServiceBatchOptions& options,
const Core::Context& context)
{
auto request = Core::Http::Request(Core::Http::HttpMethod::Post, url, &requestBody, false);
request.GetUrl().AppendQueryParameter("comp", "batch");
request.SetHeader("Content-Length", std::to_string(requestBody.Length()));
if (!options.MultipartContentType.empty())
{
request.SetHeader("Content-Type", options.MultipartContentType);
}
request.SetHeader("x-ms-version", "2020-08-04");
auto pRawResponse = pipeline.Send(request, context);
auto httpStatusCode = pRawResponse->GetStatusCode();
if (httpStatusCode != Core::Http::HttpStatusCode::Accepted)
{
throw StorageException::CreateFromResponse(std::move(pRawResponse));
}
Models::_detail::SubmitBatchResult response;
response.BodyStream = pRawResponse->ExtractBodyStream();
response.ContentType = pRawResponse->GetHeaders().at("Content-Type");
return Response<Models::_detail::SubmitBatchResult>(
std::move(response), std::move(pRawResponse));
}
Response<Models::_detail::FindBlobsByTagsResult> ServiceClient::FindBlobsByTags(
Core::Http::_internal::HttpPipeline& pipeline,
const Core::Url& url,
@ -1769,6 +1796,34 @@ namespace Azure { namespace Storage { namespace Blobs {
return Response<Models::_detail::RenameBlobContainerResult>(
std::move(response), std::move(pRawResponse));
}
Response<Models::_detail::SubmitBatchResult> BlobContainerClient::SubmitBatch(
Core::Http::_internal::HttpPipeline& pipeline,
const Core::Url& url,
Core::IO::BodyStream& requestBody,
const SubmitBlobContainerBatchOptions& options,
const Core::Context& context)
{
auto request = Core::Http::Request(Core::Http::HttpMethod::Post, url, &requestBody, false);
request.GetUrl().AppendQueryParameter("restype", "container");
request.GetUrl().AppendQueryParameter("comp", "batch");
request.SetHeader("Content-Length", std::to_string(requestBody.Length()));
if (!options.MultipartContentType.empty())
{
request.SetHeader("Content-Type", options.MultipartContentType);
}
request.SetHeader("x-ms-version", "2020-08-04");
auto pRawResponse = pipeline.Send(request, context);
auto httpStatusCode = pRawResponse->GetStatusCode();
if (httpStatusCode != Core::Http::HttpStatusCode::Accepted)
{
throw StorageException::CreateFromResponse(std::move(pRawResponse));
}
Models::_detail::SubmitBatchResult response;
response.BodyStream = pRawResponse->ExtractBodyStream();
response.ContentType = pRawResponse->GetHeaders().at("Content-Type");
return Response<Models::_detail::SubmitBatchResult>(
std::move(response), std::move(pRawResponse));
}
Response<Models::_detail::AcquireBlobContainerLeaseResult> BlobContainerClient::AcquireLease(
Core::Http::_internal::HttpPipeline& pipeline,
const Core::Url& url,

View File

@ -72,8 +72,6 @@ directive:
transform: >
delete $["/{containerName}?restype=account&comp=properties"];
delete $["/{containerName}/{blob}?restype=account&comp=properties"];
delete $["/?comp=batch"];
delete $["/{containerName}?restype=container&comp=batch"];
delete $["/{filesystem}/{path}?action=setAccessControl&blob"];
delete $["/{filesystem}/{path}?action=getAccessControl&blob"];
delete $["/{filesystem}/{path}?FileRename"];
@ -1574,4 +1572,32 @@ directive:
where: $["x-ms-paths"]["/{containerName}/{blob}?comp=legalhold"].put.responses["200"].headers
transform: >
$["x-ms-legal-hold"]["x-ms-client-name"] = "HasLegalHold";
```
### SubmitBatch
```yaml
directive:
- from: swagger-document
where: $.definitions
transform: >
$.SubmitBatchResult = {
"type": "object",
"x-ms-sealed": false,
"x-namespace": "_detail",
"properties": {
"BodyStream": {"type": "object", "format": "file"}
}
};
- from: swagger-document
where: $["x-ms-paths"]["/?comp=batch"].post.responses
transform: >
$["202"] = $["200"];
delete $["200"];
$["202"].schema = {"$ref": "#/definitions/SubmitBatchResult"};
- from: swagger-document
where: $["x-ms-paths"]["/{containerName}?restype=container&comp=batch"].post.responses["202"]
transform: >
$.schema = {"$ref": "#/definitions/SubmitBatchResult"};
```