in sdk/storage/azure-storage-blobs/src/rest_client.cpp [8182:8319]
Response<Models::GetBlockListResult> BlockBlobClient::GetBlockList(
Core::Http::_internal::HttpPipeline& pipeline,
const Core::Url& url,
const GetBlockBlobBlockListOptions& options,
const Core::Context& context)
{
auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url);
request.GetUrl().AppendQueryParameter("comp", "blocklist");
if (options.Snapshot.HasValue() && !options.Snapshot.Value().empty())
{
request.GetUrl().AppendQueryParameter(
"snapshot", _internal::UrlEncodeQueryParameter(options.Snapshot.Value()));
}
if (!options.ListType.ToString().empty())
{
request.GetUrl().AppendQueryParameter(
"blocklisttype", _internal::UrlEncodeQueryParameter(options.ListType.ToString()));
}
if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty())
{
request.SetHeader("x-ms-lease-id", options.LeaseId.Value());
}
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");
auto pRawResponse = pipeline.Send(request, context);
auto httpStatusCode = pRawResponse->GetStatusCode();
if (httpStatusCode != Core::Http::HttpStatusCode::Ok)
{
throw StorageException::CreateFromResponse(std::move(pRawResponse));
}
Models::GetBlockListResult response;
{
const auto& responseBody = pRawResponse->GetBody();
_internal::XmlReader reader(
reinterpret_cast<const char*>(responseBody.data()), responseBody.size());
enum class XmlTagEnum
{
kUnknown,
kBlockList,
kCommittedBlocks,
kBlock,
kName,
kSize,
kUncommittedBlocks,
};
const std::unordered_map<std::string, XmlTagEnum> XmlTagEnumMap{
{"BlockList", XmlTagEnum::kBlockList},
{"CommittedBlocks", XmlTagEnum::kCommittedBlocks},
{"Block", XmlTagEnum::kBlock},
{"Name", XmlTagEnum::kName},
{"Size", XmlTagEnum::kSize},
{"UncommittedBlocks", XmlTagEnum::kUncommittedBlocks},
};
std::vector<XmlTagEnum> xmlPath;
Models::BlobBlock vectorElement1;
Models::BlobBlock vectorElement2;
while (true)
{
auto node = reader.Read();
if (node.Type == _internal::XmlNodeType::End)
{
break;
}
else if (node.Type == _internal::XmlNodeType::StartTag)
{
auto ite = XmlTagEnumMap.find(node.Name);
xmlPath.push_back(ite == XmlTagEnumMap.end() ? XmlTagEnum::kUnknown : ite->second);
}
else if (node.Type == _internal::XmlNodeType::Text)
{
if (xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kBlockList
&& xmlPath[1] == XmlTagEnum::kCommittedBlocks && xmlPath[2] == XmlTagEnum::kBlock
&& xmlPath[3] == XmlTagEnum::kName)
{
vectorElement1.Name = node.Value;
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kBlockList
&& xmlPath[1] == XmlTagEnum::kCommittedBlocks && xmlPath[2] == XmlTagEnum::kBlock
&& xmlPath[3] == XmlTagEnum::kSize)
{
vectorElement1.Size = std::stoll(node.Value);
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kBlockList
&& xmlPath[1] == XmlTagEnum::kUncommittedBlocks && xmlPath[2] == XmlTagEnum::kBlock
&& xmlPath[3] == XmlTagEnum::kName)
{
vectorElement2.Name = node.Value;
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kBlockList
&& xmlPath[1] == XmlTagEnum::kUncommittedBlocks && xmlPath[2] == XmlTagEnum::kBlock
&& xmlPath[3] == XmlTagEnum::kSize)
{
vectorElement2.Size = std::stoll(node.Value);
}
}
else if (node.Type == _internal::XmlNodeType::Attribute)
{
}
else if (node.Type == _internal::XmlNodeType::EndTag)
{
if (xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kBlockList
&& xmlPath[1] == XmlTagEnum::kCommittedBlocks && xmlPath[2] == XmlTagEnum::kBlock)
{
response.CommittedBlocks.push_back(std::move(vectorElement1));
vectorElement1 = Models::BlobBlock();
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kBlockList
&& xmlPath[1] == XmlTagEnum::kUncommittedBlocks && xmlPath[2] == XmlTagEnum::kBlock)
{
response.UncommittedBlocks.push_back(std::move(vectorElement2));
vectorElement2 = Models::BlobBlock();
}
xmlPath.pop_back();
}
}
}
if (pRawResponse->GetHeaders().count("Last-Modified") != 0)
{
response.LastModified = DateTime::Parse(
pRawResponse->GetHeaders().at("Last-Modified"), Azure::DateTime::DateFormat::Rfc1123);
}
if (pRawResponse->GetHeaders().count("ETag") != 0)
{
response.ETag = ETag(pRawResponse->GetHeaders().at("ETag"));
}
if (pRawResponse->GetHeaders().count("x-ms-blob-content-length") != 0)
{
response.BlobSize = std::stoll(pRawResponse->GetHeaders().at("x-ms-blob-content-length"));
}
return Response<Models::GetBlockListResult>(std::move(response), std::move(pRawResponse));
}