in sdk/storage/azure-storage-files-shares/src/rest_client.cpp [559:1013]
Response<Models::_detail::ListSharesResponse> ServiceClient::ListSharesSegment(
Core::Http::_internal::HttpPipeline& pipeline,
const Core::Url& url,
const ListServiceSharesSegmentOptions& 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()
&& !ListSharesIncludeFlagsToString(options.Include.Value()).empty())
{
request.GetUrl().AppendQueryParameter(
"include",
_internal::UrlEncodeQueryParameter(
ListSharesIncludeFlagsToString(options.Include.Value())));
}
request.SetHeader("x-ms-version", "2025-05-05");
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::Ok)
{
throw StorageException::CreateFromResponse(std::move(pRawResponse));
}
Models::_detail::ListSharesResponse response;
{
const auto& responseBody = pRawResponse->GetBody();
_internal::XmlReader reader(
reinterpret_cast<const char*>(responseBody.data()), responseBody.size());
enum class XmlTagEnum
{
kUnknown,
kEnumerationResults,
kPrefix,
kMarker,
kMaxResults,
kShares,
kShare,
kName,
kSnapshot,
kDeleted,
kVersion,
kMetadata,
kProperties,
kLastModified,
kEtag,
kQuota,
kProvisionedIops,
kProvisionedIngressMBps,
kProvisionedEgressMBps,
kProvisionedBandwidthMiBps,
kNextAllowedQuotaDowngradeTime,
kDeletedTime,
kRemainingRetentionDays,
kAccessTier,
kAccessTierChangeTime,
kAccessTierTransitionState,
kLeaseStatus,
kLeaseState,
kLeaseDuration,
kEnabledProtocols,
kRootSquash,
kEnableSnapshotVirtualDirectoryAccess,
kPaidBurstingEnabled,
kPaidBurstingMaxIops,
kPaidBurstingMaxBandwidthMibps,
kIncludedBurstIops,
kMaxBurstCreditsForIops,
kNextAllowedProvisionedIopsDowngradeTime,
kNextAllowedProvisionedBandwidthDowngradeTime,
kNextMarker,
};
const std::unordered_map<std::string, XmlTagEnum> XmlTagEnumMap{
{"EnumerationResults", XmlTagEnum::kEnumerationResults},
{"Prefix", XmlTagEnum::kPrefix},
{"Marker", XmlTagEnum::kMarker},
{"MaxResults", XmlTagEnum::kMaxResults},
{"Shares", XmlTagEnum::kShares},
{"Share", XmlTagEnum::kShare},
{"Name", XmlTagEnum::kName},
{"Snapshot", XmlTagEnum::kSnapshot},
{"Deleted", XmlTagEnum::kDeleted},
{"Version", XmlTagEnum::kVersion},
{"Metadata", XmlTagEnum::kMetadata},
{"Properties", XmlTagEnum::kProperties},
{"Last-Modified", XmlTagEnum::kLastModified},
{"Etag", XmlTagEnum::kEtag},
{"Quota", XmlTagEnum::kQuota},
{"ProvisionedIops", XmlTagEnum::kProvisionedIops},
{"ProvisionedIngressMBps", XmlTagEnum::kProvisionedIngressMBps},
{"ProvisionedEgressMBps", XmlTagEnum::kProvisionedEgressMBps},
{"ProvisionedBandwidthMiBps", XmlTagEnum::kProvisionedBandwidthMiBps},
{"NextAllowedQuotaDowngradeTime", XmlTagEnum::kNextAllowedQuotaDowngradeTime},
{"DeletedTime", XmlTagEnum::kDeletedTime},
{"RemainingRetentionDays", XmlTagEnum::kRemainingRetentionDays},
{"AccessTier", XmlTagEnum::kAccessTier},
{"AccessTierChangeTime", XmlTagEnum::kAccessTierChangeTime},
{"AccessTierTransitionState", XmlTagEnum::kAccessTierTransitionState},
{"LeaseStatus", XmlTagEnum::kLeaseStatus},
{"LeaseState", XmlTagEnum::kLeaseState},
{"LeaseDuration", XmlTagEnum::kLeaseDuration},
{"EnabledProtocols", XmlTagEnum::kEnabledProtocols},
{"RootSquash", XmlTagEnum::kRootSquash},
{"EnableSnapshotVirtualDirectoryAccess",
XmlTagEnum::kEnableSnapshotVirtualDirectoryAccess},
{"PaidBurstingEnabled", XmlTagEnum::kPaidBurstingEnabled},
{"PaidBurstingMaxIops", XmlTagEnum::kPaidBurstingMaxIops},
{"PaidBurstingMaxBandwidthMibps", XmlTagEnum::kPaidBurstingMaxBandwidthMibps},
{"IncludedBurstIops", XmlTagEnum::kIncludedBurstIops},
{"MaxBurstCreditsForIops", XmlTagEnum::kMaxBurstCreditsForIops},
{"NextAllowedProvisionedIopsDowngradeTime",
XmlTagEnum::kNextAllowedProvisionedIopsDowngradeTime},
{"NextAllowedProvisionedBandwidthDowngradeTime",
XmlTagEnum::kNextAllowedProvisionedBandwidthDowngradeTime},
{"NextMarker", XmlTagEnum::kNextMarker},
};
std::vector<XmlTagEnum> xmlPath;
Models::ShareItem 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::kShares && xmlPath[2] == XmlTagEnum::kShare
&& 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() == 2 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kMarker)
{
response.Marker = node.Value;
}
else if (
xmlPath.size() == 2 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kMaxResults)
{
response.MaxResults = std::stoi(node.Value);
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kName)
{
vectorElement1.Name = node.Value;
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kSnapshot)
{
vectorElement1.Snapshot = node.Value;
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kDeleted)
{
vectorElement1.Deleted = node.Value == std::string("true");
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kVersion)
{
vectorElement1.Version = node.Value;
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kMetadata)
{
mapValue3 = node.Value;
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties && xmlPath[4] == XmlTagEnum::kLastModified)
{
vectorElement1.Details.LastModified
= DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc1123);
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties && xmlPath[4] == XmlTagEnum::kEtag)
{
vectorElement1.Details.Etag = ETag(node.Value);
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties && xmlPath[4] == XmlTagEnum::kQuota)
{
vectorElement1.Details.Quota = std::stoll(node.Value);
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties
&& xmlPath[4] == XmlTagEnum::kProvisionedIops)
{
vectorElement1.Details.ProvisionedIops = std::stoi(node.Value);
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties
&& xmlPath[4] == XmlTagEnum::kProvisionedIngressMBps)
{
vectorElement1.Details.ProvisionedIngressMBps = std::stoi(node.Value);
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties
&& xmlPath[4] == XmlTagEnum::kProvisionedEgressMBps)
{
vectorElement1.Details.ProvisionedEgressMBps = std::stoi(node.Value);
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties
&& xmlPath[4] == XmlTagEnum::kProvisionedBandwidthMiBps)
{
vectorElement1.Details.ProvisionedBandwidthMBps = std::stoi(node.Value);
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties
&& xmlPath[4] == XmlTagEnum::kNextAllowedQuotaDowngradeTime)
{
vectorElement1.Details.NextAllowedQuotaDowngradeTime
= DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc1123);
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties && xmlPath[4] == XmlTagEnum::kDeletedTime)
{
vectorElement1.Details.DeletedOn
= DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc1123);
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties
&& xmlPath[4] == XmlTagEnum::kRemainingRetentionDays)
{
vectorElement1.Details.RemainingRetentionDays = std::stoi(node.Value);
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties && xmlPath[4] == XmlTagEnum::kAccessTier)
{
vectorElement1.Details.AccessTier = Models::AccessTier(node.Value);
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties
&& xmlPath[4] == XmlTagEnum::kAccessTierChangeTime)
{
vectorElement1.Details.AccessTierChangedOn
= DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc1123);
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties
&& xmlPath[4] == XmlTagEnum::kAccessTierTransitionState)
{
vectorElement1.Details.AccessTierTransitionState = node.Value;
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties && xmlPath[4] == XmlTagEnum::kLeaseStatus)
{
vectorElement1.Details.LeaseStatus = Models::LeaseStatus(node.Value);
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties && xmlPath[4] == XmlTagEnum::kLeaseState)
{
vectorElement1.Details.LeaseState = Models::LeaseState(node.Value);
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties
&& xmlPath[4] == XmlTagEnum::kLeaseDuration)
{
vectorElement1.Details.LeaseDuration = Models::LeaseDurationType(node.Value);
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties
&& xmlPath[4] == XmlTagEnum::kEnabledProtocols)
{
vectorElement1.Details.EnabledProtocols = Models::ShareProtocols(node.Value);
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties && xmlPath[4] == XmlTagEnum::kRootSquash)
{
vectorElement1.Details.RootSquash = Models::ShareRootSquash(node.Value);
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties
&& xmlPath[4] == XmlTagEnum::kEnableSnapshotVirtualDirectoryAccess)
{
vectorElement1.Details.EnableSnapshotVirtualDirectoryAccess
= node.Value == std::string("true");
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties
&& xmlPath[4] == XmlTagEnum::kPaidBurstingEnabled)
{
vectorElement1.Details.PaidBurstingEnabled = node.Value == std::string("true");
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties
&& xmlPath[4] == XmlTagEnum::kPaidBurstingMaxIops)
{
vectorElement1.Details.PaidBurstingMaxIops = std::stoll(node.Value);
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties
&& xmlPath[4] == XmlTagEnum::kPaidBurstingMaxBandwidthMibps)
{
vectorElement1.Details.PaidBurstingMaxBandwidthMibps = std::stoll(node.Value);
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties
&& xmlPath[4] == XmlTagEnum::kIncludedBurstIops)
{
vectorElement1.Details.IncludedBurstIops = std::stoll(node.Value);
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties
&& xmlPath[4] == XmlTagEnum::kMaxBurstCreditsForIops)
{
vectorElement1.Details.MaxBurstCreditsForIops = std::stoll(node.Value);
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties
&& xmlPath[4] == XmlTagEnum::kNextAllowedProvisionedIopsDowngradeTime)
{
vectorElement1.Details.NextAllowedProvisionedIopsDowngradeTime
= DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc1123);
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kProperties
&& xmlPath[4] == XmlTagEnum::kNextAllowedProvisionedBandwidthDowngradeTime)
{
vectorElement1.Details.NextAllowedProvisionedBandwidthDowngradeTime
= DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc1123);
}
else if (
xmlPath.size() == 2 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kNextMarker)
{
response.NextMarker = 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::kShares && xmlPath[2] == XmlTagEnum::kShare
&& xmlPath[3] == XmlTagEnum::kMetadata)
{
vectorElement1.Metadata[std::move(mapKey2)] = std::move(mapValue3);
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kShares && xmlPath[2] == XmlTagEnum::kShare)
{
response.ShareItems.push_back(std::move(vectorElement1));
vectorElement1 = Models::ShareItem();
}
xmlPath.pop_back();
}
}
}
return Response<Models::_detail::ListSharesResponse>(
std::move(response), std::move(pRawResponse));
}