public async Task<IReadOnlyList<EntityWithId<WebResourceName, string>>> GetEntities (IEnumerable<WebResourceName> eventUrls)
{
WebResourceName firstResourceNameOrNull = null;
var requestBody = @"<?xml version=""1.0""?>
<C:calendar-multiget xmlns:C=""urn:ietf:params:xml:ns:caldav"" xmlns:D=""DAV:"">
<D:prop>
<D:getetag/>
<D:displayname/>
<C:calendar-data/>
</D:prop>
" +
String.Join (
"\r\n",
eventUrls.Select (
u =>
{
if (firstResourceNameOrNull == null)
firstResourceNameOrNull = u;
return $"<D:href>{SecurityElement.Escape(u.OriginalAbsolutePath)}</D:href>";
})) + @"
</C:calendar-multiget>";
var responseXml = await _webDavClient.ExecuteWebDavRequestAndReadResponse (
UriHelper.AlignServerUrl (_serverUrl, firstResourceNameOrNull),
"REPORT",
1,
null,
null,
"application/xml",
requestBody
);
XmlNodeList responseNodes = responseXml.XmlDocument.SelectNodes ("/D:multistatus/D:response", responseXml.XmlNamespaceManager);
var entities = new List<EntityWithId<WebResourceName, string>>();
if (responseNodes == null)
return entities;
// ReSharper disable once LoopCanBeConvertedToQuery
// ReSharper disable once PossibleNullReferenceException
foreach (XmlElement responseElement in responseNodes)
{
var urlNode = responseElement.SelectSingleNode ("D:href", responseXml.XmlNamespaceManager);
var dataNode = responseElement.SelectSingleNode ("D:propstat/D:prop/C:calendar-data", responseXml.XmlNamespaceManager);
if (urlNode != null && !string.IsNullOrEmpty (dataNode?.InnerText))
{
entities.Add (EntityWithId.Create (new WebResourceName(urlNode.InnerText), dataNode.InnerText));
}
}
return entities;
}