public async Task<IReadOnlyList<EntityWithId<WebResourceName, string>>> GetEntities (IEnumerable<WebResourceName> urls)
{
s_logger.Debug ("Entered GetEntities.");
WebResourceName firstResourceNameOrNull = null;
var requestBody = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
<A:addressbook-multiget xmlns:D=""DAV:"" xmlns:A=""urn:ietf:params:xml:ns:carddav"">
<D:prop>
<D:getetag/>
<D:getcontenttype/>
<A:address-data/>
</D:prop>
" +
String.Join ("\r\n", urls.Select (u =>
{
if (s_logger.IsDebugEnabled)
s_logger.Debug ($"Requesting: '{u}'");
if (firstResourceNameOrNull == null)
firstResourceNameOrNull = u;
return $"<D:href>{SecurityElement.Escape (u.OriginalAbsolutePath)}</D:href>";
}))
+ @"
</A:addressbook-multiget>
";
var responseXml = await _webDavClient.ExecuteWebDavRequestAndReadResponse (
UriHelper.AlignServerUrl (_serverUrl, firstResourceNameOrNull) ,
"REPORT",
0,
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/A:address-data", responseXml.XmlNamespaceManager);
var contentTypeNode = responseElement.SelectSingleNode("D:propstat/D:prop/D:getcontenttype", responseXml.XmlNamespaceManager);
string contentType = contentTypeNode?.InnerText ?? string.Empty;
// TODO: add vlist support but for now filter out sogo vlists since we can't parse them atm
if (urlNode != null && dataNode != null && !string.IsNullOrEmpty (dataNode.InnerText) && contentType != "text/x-vlist")
{
if (s_logger.IsDebugEnabled)
s_logger.DebugFormat ($"Got: '{urlNode.InnerText}'");
entities.Add (EntityWithId.Create (new WebResourceName(urlNode.InnerText), dataNode.InnerText));
}
}
s_logger.Debug ("Exiting GetEntities.");
return entities;
}
}