public async Task<EntityVersion<WebResourceName, string>> TryUpdateEntity (WebResourceName url, string etag, string contents)
{
s_logger.DebugFormat ("Updating entity '{0}'", url);
var absoluteEventUrl = new Uri(_serverUrl, url.OriginalAbsolutePath);
s_logger.DebugFormat ("Absolute entity location: '{0}'", absoluteEventUrl);
IHttpHeaders responseHeaders;
try
{
responseHeaders = await _webDavClient.ExecuteWebDavRequestAndReturnResponseHeaders(
absoluteEventUrl,
"PUT",
null,
etag,
null,
"text/calendar",
contents);
}
catch (WebDavClientException x) when (x.StatusCode == HttpStatusCode.NotFound || x.StatusCode == HttpStatusCode.PreconditionFailed)
{
return null;
}
if (s_logger.IsDebugEnabled)
s_logger.DebugFormat ("Updated entity. Server response header: '{0}'", responseHeaders.ToString().Replace ("\r\n", " <CR> "));
Uri effectiveEventUrl;
if (responseHeaders.Location != null)
{
s_logger.DebugFormat ("Server sent new location: '{0}'", responseHeaders.Location);
effectiveEventUrl = responseHeaders.Location.IsAbsoluteUri ? responseHeaders.Location : new Uri(_serverUrl, responseHeaders.Location);
s_logger.DebugFormat ("New entity location: '{0}'", effectiveEventUrl);
}
else
{
effectiveEventUrl = absoluteEventUrl;
}
var newEtag = responseHeaders.ETag;
string version;
if (newEtag != null)
{
version = newEtag;
}
else
{
version = await GetEtag (effectiveEventUrl);
}
return new EntityVersion<WebResourceName, string> (new WebResourceName(effectiveEventUrl), version);
}