in sdk/storage/azure-storage-queues/src/rest_client.cpp [912:1047]
Response<Models::ReceivedMessages> QueueClient::ReceiveMessages(
Core::Http::_internal::HttpPipeline& pipeline,
const Core::Url& url,
const ReceiveQueueMessagesOptions& options,
const Core::Context& context)
{
auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url);
if (options.NumberOfMessages.HasValue())
{
request.GetUrl().AppendQueryParameter(
"numofmessages", std::to_string(options.NumberOfMessages.Value()));
}
if (options.Visibilitytimeout.HasValue())
{
request.GetUrl().AppendQueryParameter(
"visibilitytimeout", std::to_string(options.Visibilitytimeout.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::ReceivedMessages response;
{
const auto& responseBody = pRawResponse->GetBody();
_internal::XmlReader reader(
reinterpret_cast<const char*>(responseBody.data()), responseBody.size());
enum class XmlTagEnum
{
kUnknown,
kQueueMessagesList,
kQueueMessage,
kMessageId,
kInsertionTime,
kExpirationTime,
kPopReceipt,
kTimeNextVisible,
kDequeueCount,
kMessageText,
};
const std::unordered_map<std::string, XmlTagEnum> XmlTagEnumMap{
{"QueueMessagesList", XmlTagEnum::kQueueMessagesList},
{"QueueMessage", XmlTagEnum::kQueueMessage},
{"MessageId", XmlTagEnum::kMessageId},
{"InsertionTime", XmlTagEnum::kInsertionTime},
{"ExpirationTime", XmlTagEnum::kExpirationTime},
{"PopReceipt", XmlTagEnum::kPopReceipt},
{"TimeNextVisible", XmlTagEnum::kTimeNextVisible},
{"DequeueCount", XmlTagEnum::kDequeueCount},
{"MessageText", XmlTagEnum::kMessageText},
};
std::vector<XmlTagEnum> xmlPath;
Models::QueueMessage vectorElement1;
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() == 3 && xmlPath[0] == XmlTagEnum::kQueueMessagesList
&& xmlPath[1] == XmlTagEnum::kQueueMessage && xmlPath[2] == XmlTagEnum::kMessageId)
{
vectorElement1.MessageId = node.Value;
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kQueueMessagesList
&& xmlPath[1] == XmlTagEnum::kQueueMessage
&& xmlPath[2] == XmlTagEnum::kInsertionTime)
{
vectorElement1.InsertedOn
= DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc1123);
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kQueueMessagesList
&& xmlPath[1] == XmlTagEnum::kQueueMessage
&& xmlPath[2] == XmlTagEnum::kExpirationTime)
{
vectorElement1.ExpiresOn
= DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc1123);
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kQueueMessagesList
&& xmlPath[1] == XmlTagEnum::kQueueMessage && xmlPath[2] == XmlTagEnum::kPopReceipt)
{
vectorElement1.PopReceipt = node.Value;
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kQueueMessagesList
&& xmlPath[1] == XmlTagEnum::kQueueMessage
&& xmlPath[2] == XmlTagEnum::kTimeNextVisible)
{
vectorElement1.NextVisibleOn
= DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc1123);
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kQueueMessagesList
&& xmlPath[1] == XmlTagEnum::kQueueMessage
&& xmlPath[2] == XmlTagEnum::kDequeueCount)
{
vectorElement1.DequeueCount = std::stoll(node.Value);
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kQueueMessagesList
&& xmlPath[1] == XmlTagEnum::kQueueMessage
&& xmlPath[2] == XmlTagEnum::kMessageText)
{
vectorElement1.MessageText = node.Value;
}
}
else if (node.Type == _internal::XmlNodeType::Attribute)
{
}
else if (node.Type == _internal::XmlNodeType::EndTag)
{
if (xmlPath.size() == 2 && xmlPath[0] == XmlTagEnum::kQueueMessagesList
&& xmlPath[1] == XmlTagEnum::kQueueMessage)
{
response.Messages.push_back(std::move(vectorElement1));
vectorElement1 = Models::QueueMessage();
}
xmlPath.pop_back();
}
}
}
return Response<Models::ReceivedMessages>(std::move(response), std::move(pRawResponse));
}