in sdk/storage/azure-storage-files-shares/src/rest_client.cpp [1809:1920]
Response<Models::ShareAccessPolicy> ShareClient::GetAccessPolicy(
Core::Http::_internal::HttpPipeline& pipeline,
const Core::Url& url,
const GetShareAccessPolicyOptions& options,
const Core::Context& context)
{
auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url);
request.GetUrl().AppendQueryParameter("restype", "share");
request.GetUrl().AppendQueryParameter("comp", "acl");
request.SetHeader("x-ms-version", "2025-05-05");
if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty())
{
request.SetHeader("x-ms-lease-id", options.LeaseId.Value());
}
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::ShareAccessPolicy response;
{
const auto& responseBody = pRawResponse->GetBody();
_internal::XmlReader reader(
reinterpret_cast<const char*>(responseBody.data()), responseBody.size());
enum class XmlTagEnum
{
kUnknown,
kSignedIdentifiers,
kSignedIdentifier,
kId,
kAccessPolicy,
kStart,
kExpiry,
kPermission,
};
const std::unordered_map<std::string, XmlTagEnum> XmlTagEnumMap{
{"SignedIdentifiers", XmlTagEnum::kSignedIdentifiers},
{"SignedIdentifier", XmlTagEnum::kSignedIdentifier},
{"Id", XmlTagEnum::kId},
{"AccessPolicy", XmlTagEnum::kAccessPolicy},
{"Start", XmlTagEnum::kStart},
{"Expiry", XmlTagEnum::kExpiry},
{"Permission", XmlTagEnum::kPermission},
};
std::vector<XmlTagEnum> xmlPath;
Models::SignedIdentifier 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::kSignedIdentifiers
&& xmlPath[1] == XmlTagEnum::kSignedIdentifier && xmlPath[2] == XmlTagEnum::kId)
{
vectorElement1.Id = node.Value;
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kSignedIdentifiers
&& xmlPath[1] == XmlTagEnum::kSignedIdentifier
&& xmlPath[2] == XmlTagEnum::kAccessPolicy && xmlPath[3] == XmlTagEnum::kStart)
{
vectorElement1.Policy.StartsOn
= DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc3339);
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kSignedIdentifiers
&& xmlPath[1] == XmlTagEnum::kSignedIdentifier
&& xmlPath[2] == XmlTagEnum::kAccessPolicy && xmlPath[3] == XmlTagEnum::kExpiry)
{
vectorElement1.Policy.ExpiresOn
= DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc3339);
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kSignedIdentifiers
&& xmlPath[1] == XmlTagEnum::kSignedIdentifier
&& xmlPath[2] == XmlTagEnum::kAccessPolicy && xmlPath[3] == XmlTagEnum::kPermission)
{
vectorElement1.Policy.Permission = node.Value;
}
}
else if (node.Type == _internal::XmlNodeType::Attribute)
{
}
else if (node.Type == _internal::XmlNodeType::EndTag)
{
if (xmlPath.size() == 2 && xmlPath[0] == XmlTagEnum::kSignedIdentifiers
&& xmlPath[1] == XmlTagEnum::kSignedIdentifier)
{
response.SignedIdentifiers.push_back(std::move(vectorElement1));
vectorElement1 = Models::SignedIdentifier();
}
xmlPath.pop_back();
}
}
}
return Response<Models::ShareAccessPolicy>(std::move(response), std::move(pRawResponse));
}