in sdk/storage/azure-storage-blobs/src/rest_client.cpp [391:686]
Response<Models::BlobServiceProperties> ServiceClient::GetProperties(
Core::Http::_internal::HttpPipeline& pipeline,
const Core::Url& url,
const GetServicePropertiesOptions& options,
const Core::Context& context)
{
auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url);
request.GetUrl().AppendQueryParameter("restype", "service");
request.GetUrl().AppendQueryParameter("comp", "properties");
request.SetHeader("x-ms-version", "2024-08-04");
(void)options;
auto pRawResponse = pipeline.Send(request, context);
auto httpStatusCode = pRawResponse->GetStatusCode();
if (httpStatusCode != Core::Http::HttpStatusCode::Ok)
{
throw StorageException::CreateFromResponse(std::move(pRawResponse));
}
Models::BlobServiceProperties response;
{
const auto& responseBody = pRawResponse->GetBody();
_internal::XmlReader reader(
reinterpret_cast<const char*>(responseBody.data()), responseBody.size());
enum class XmlTagEnum
{
kUnknown,
kStorageServiceProperties,
kLogging,
kVersion,
kDelete,
kRead,
kWrite,
kRetentionPolicy,
kEnabled,
kDays,
kHourMetrics,
kIncludeAPIs,
kMinuteMetrics,
kCors,
kCorsRule,
kAllowedOrigins,
kAllowedMethods,
kAllowedHeaders,
kExposedHeaders,
kMaxAgeInSeconds,
kDefaultServiceVersion,
kDeleteRetentionPolicy,
kStaticWebsite,
kIndexDocument,
kErrorDocument404Path,
kDefaultIndexDocumentPath,
};
const std::unordered_map<std::string, XmlTagEnum> XmlTagEnumMap{
{"StorageServiceProperties", XmlTagEnum::kStorageServiceProperties},
{"Logging", XmlTagEnum::kLogging},
{"Version", XmlTagEnum::kVersion},
{"Delete", XmlTagEnum::kDelete},
{"Read", XmlTagEnum::kRead},
{"Write", XmlTagEnum::kWrite},
{"RetentionPolicy", XmlTagEnum::kRetentionPolicy},
{"Enabled", XmlTagEnum::kEnabled},
{"Days", XmlTagEnum::kDays},
{"HourMetrics", XmlTagEnum::kHourMetrics},
{"IncludeAPIs", XmlTagEnum::kIncludeAPIs},
{"MinuteMetrics", XmlTagEnum::kMinuteMetrics},
{"Cors", XmlTagEnum::kCors},
{"CorsRule", XmlTagEnum::kCorsRule},
{"AllowedOrigins", XmlTagEnum::kAllowedOrigins},
{"AllowedMethods", XmlTagEnum::kAllowedMethods},
{"AllowedHeaders", XmlTagEnum::kAllowedHeaders},
{"ExposedHeaders", XmlTagEnum::kExposedHeaders},
{"MaxAgeInSeconds", XmlTagEnum::kMaxAgeInSeconds},
{"DefaultServiceVersion", XmlTagEnum::kDefaultServiceVersion},
{"DeleteRetentionPolicy", XmlTagEnum::kDeleteRetentionPolicy},
{"StaticWebsite", XmlTagEnum::kStaticWebsite},
{"IndexDocument", XmlTagEnum::kIndexDocument},
{"ErrorDocument404Path", XmlTagEnum::kErrorDocument404Path},
{"DefaultIndexDocumentPath", XmlTagEnum::kDefaultIndexDocumentPath},
};
std::vector<XmlTagEnum> xmlPath;
Models::CorsRule 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::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kLogging && xmlPath[2] == XmlTagEnum::kVersion)
{
response.Logging.Version = node.Value;
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kLogging && xmlPath[2] == XmlTagEnum::kDelete)
{
response.Logging.Delete = node.Value == std::string("true");
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kLogging && xmlPath[2] == XmlTagEnum::kRead)
{
response.Logging.Read = node.Value == std::string("true");
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kLogging && xmlPath[2] == XmlTagEnum::kWrite)
{
response.Logging.Write = node.Value == std::string("true");
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kLogging && xmlPath[2] == XmlTagEnum::kRetentionPolicy
&& xmlPath[3] == XmlTagEnum::kEnabled)
{
response.Logging.RetentionPolicy.IsEnabled = node.Value == std::string("true");
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kLogging && xmlPath[2] == XmlTagEnum::kRetentionPolicy
&& xmlPath[3] == XmlTagEnum::kDays)
{
response.Logging.RetentionPolicy.Days = std::stoi(node.Value);
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kHourMetrics && xmlPath[2] == XmlTagEnum::kVersion)
{
response.HourMetrics.Version = node.Value;
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kHourMetrics && xmlPath[2] == XmlTagEnum::kEnabled)
{
response.HourMetrics.IsEnabled = node.Value == std::string("true");
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kHourMetrics && xmlPath[2] == XmlTagEnum::kIncludeAPIs)
{
response.HourMetrics.IncludeApis = node.Value == std::string("true");
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kHourMetrics
&& xmlPath[2] == XmlTagEnum::kRetentionPolicy && xmlPath[3] == XmlTagEnum::kEnabled)
{
response.HourMetrics.RetentionPolicy.IsEnabled = node.Value == std::string("true");
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kHourMetrics
&& xmlPath[2] == XmlTagEnum::kRetentionPolicy && xmlPath[3] == XmlTagEnum::kDays)
{
response.HourMetrics.RetentionPolicy.Days = std::stoi(node.Value);
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kMinuteMetrics && xmlPath[2] == XmlTagEnum::kVersion)
{
response.MinuteMetrics.Version = node.Value;
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kMinuteMetrics && xmlPath[2] == XmlTagEnum::kEnabled)
{
response.MinuteMetrics.IsEnabled = node.Value == std::string("true");
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kMinuteMetrics
&& xmlPath[2] == XmlTagEnum::kIncludeAPIs)
{
response.MinuteMetrics.IncludeApis = node.Value == std::string("true");
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kMinuteMetrics
&& xmlPath[2] == XmlTagEnum::kRetentionPolicy && xmlPath[3] == XmlTagEnum::kEnabled)
{
response.MinuteMetrics.RetentionPolicy.IsEnabled = node.Value == std::string("true");
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kMinuteMetrics
&& xmlPath[2] == XmlTagEnum::kRetentionPolicy && xmlPath[3] == XmlTagEnum::kDays)
{
response.MinuteMetrics.RetentionPolicy.Days = std::stoi(node.Value);
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kCors && xmlPath[2] == XmlTagEnum::kCorsRule
&& xmlPath[3] == XmlTagEnum::kAllowedOrigins)
{
vectorElement1.AllowedOrigins = node.Value;
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kCors && xmlPath[2] == XmlTagEnum::kCorsRule
&& xmlPath[3] == XmlTagEnum::kAllowedMethods)
{
vectorElement1.AllowedMethods = node.Value;
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kCors && xmlPath[2] == XmlTagEnum::kCorsRule
&& xmlPath[3] == XmlTagEnum::kAllowedHeaders)
{
vectorElement1.AllowedHeaders = node.Value;
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kCors && xmlPath[2] == XmlTagEnum::kCorsRule
&& xmlPath[3] == XmlTagEnum::kExposedHeaders)
{
vectorElement1.ExposedHeaders = node.Value;
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kCors && xmlPath[2] == XmlTagEnum::kCorsRule
&& xmlPath[3] == XmlTagEnum::kMaxAgeInSeconds)
{
vectorElement1.MaxAgeInSeconds = std::stoi(node.Value);
}
else if (
xmlPath.size() == 2 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kDefaultServiceVersion)
{
response.DefaultServiceVersion = node.Value;
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kDeleteRetentionPolicy
&& xmlPath[2] == XmlTagEnum::kEnabled)
{
response.DeleteRetentionPolicy.IsEnabled = node.Value == std::string("true");
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kDeleteRetentionPolicy
&& xmlPath[2] == XmlTagEnum::kDays)
{
response.DeleteRetentionPolicy.Days = std::stoi(node.Value);
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kStaticWebsite && xmlPath[2] == XmlTagEnum::kEnabled)
{
response.StaticWebsite.IsEnabled = node.Value == std::string("true");
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kStaticWebsite
&& xmlPath[2] == XmlTagEnum::kIndexDocument)
{
response.StaticWebsite.IndexDocument = node.Value;
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kStaticWebsite
&& xmlPath[2] == XmlTagEnum::kErrorDocument404Path)
{
response.StaticWebsite.ErrorDocument404Path = node.Value;
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kStaticWebsite
&& xmlPath[2] == XmlTagEnum::kDefaultIndexDocumentPath)
{
response.StaticWebsite.DefaultIndexDocumentPath = node.Value;
}
}
else if (node.Type == _internal::XmlNodeType::Attribute)
{
}
else if (node.Type == _internal::XmlNodeType::EndTag)
{
if (xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kStorageServiceProperties
&& xmlPath[1] == XmlTagEnum::kCors && xmlPath[2] == XmlTagEnum::kCorsRule)
{
response.Cors.push_back(std::move(vectorElement1));
vectorElement1 = Models::CorsRule();
}
xmlPath.pop_back();
}
}
}
return Response<Models::BlobServiceProperties>(std::move(response), std::move(pRawResponse));
}