in sdk/storage/azure-storage-queues/src/rest_client.cpp [518:660]
Response<Models::_detail::ListQueuesResult> ServiceClient::ListQueuesSegment(
Core::Http::_internal::HttpPipeline& pipeline,
const Core::Url& url,
const ListServiceQueuesSegmentOptions& options,
const Core::Context& context)
{
auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url);
request.GetUrl().AppendQueryParameter("comp", "list");
if (options.Prefix.HasValue() && !options.Prefix.Value().empty())
{
request.GetUrl().AppendQueryParameter(
"prefix", _internal::UrlEncodeQueryParameter(options.Prefix.Value()));
}
if (options.Marker.HasValue() && !options.Marker.Value().empty())
{
request.GetUrl().AppendQueryParameter(
"marker", _internal::UrlEncodeQueryParameter(options.Marker.Value()));
}
if (options.MaxResults.HasValue())
{
request.GetUrl().AppendQueryParameter(
"maxresults", std::to_string(options.MaxResults.Value()));
}
if (options.Include.HasValue()
&& !ListQueuesIncludeFlagsToString(options.Include.Value()).empty())
{
request.GetUrl().AppendQueryParameter(
"include",
_internal::UrlEncodeQueryParameter(
ListQueuesIncludeFlagsToString(options.Include.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::_detail::ListQueuesResult response;
{
const auto& responseBody = pRawResponse->GetBody();
_internal::XmlReader reader(
reinterpret_cast<const char*>(responseBody.data()), responseBody.size());
enum class XmlTagEnum
{
kUnknown,
kEnumerationResults,
kPrefix,
kQueues,
kQueue,
kName,
kMetadata,
kNextMarker,
};
const std::unordered_map<std::string, XmlTagEnum> XmlTagEnumMap{
{"EnumerationResults", XmlTagEnum::kEnumerationResults},
{"Prefix", XmlTagEnum::kPrefix},
{"Queues", XmlTagEnum::kQueues},
{"Queue", XmlTagEnum::kQueue},
{"Name", XmlTagEnum::kName},
{"Metadata", XmlTagEnum::kMetadata},
{"NextMarker", XmlTagEnum::kNextMarker},
};
std::vector<XmlTagEnum> xmlPath;
Models::QueueItem vectorElement1;
std::string mapKey2;
std::string mapValue3;
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);
if (xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kQueues && xmlPath[2] == XmlTagEnum::kQueue
&& xmlPath[3] == XmlTagEnum::kMetadata)
{
mapKey2 = node.Name;
}
}
else if (node.Type == _internal::XmlNodeType::Text)
{
if (xmlPath.size() == 2 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kPrefix)
{
response.Prefix = node.Value;
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kQueues && xmlPath[2] == XmlTagEnum::kQueue
&& xmlPath[3] == XmlTagEnum::kName)
{
vectorElement1.Name = node.Value;
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kQueues && xmlPath[2] == XmlTagEnum::kQueue
&& xmlPath[3] == XmlTagEnum::kMetadata)
{
mapValue3 = node.Value;
}
else if (
xmlPath.size() == 2 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kNextMarker)
{
response.ContinuationToken = node.Value;
}
}
else if (node.Type == _internal::XmlNodeType::Attribute)
{
if (xmlPath.size() == 1 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& node.Name == "ServiceEndpoint")
{
response.ServiceEndpoint = node.Value;
}
}
else if (node.Type == _internal::XmlNodeType::EndTag)
{
if (xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kQueues && xmlPath[2] == XmlTagEnum::kQueue
&& xmlPath[3] == XmlTagEnum::kMetadata)
{
vectorElement1.Metadata[std::move(mapKey2)] = std::move(mapValue3);
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kQueues && xmlPath[2] == XmlTagEnum::kQueue)
{
response.Items.push_back(std::move(vectorElement1));
vectorElement1 = Models::QueueItem();
}
xmlPath.pop_back();
}
}
}
return Response<Models::_detail::ListQueuesResult>(
std::move(response), std::move(pRawResponse));
}