public async Task MkCalendar(Dictionary <string, string> propertiesAndHeaders, string body, HttpResponse response) { #region Extracting Properties string principalId; propertiesAndHeaders.TryGetValue("principalId", out principalId); string url; propertiesAndHeaders.TryGetValue("url", out url); #endregion propertiesAndHeaders.Add("body", body); PreconditionCheck = new MKCalendarPrecondition(StorageManagement, _collectionRespository); PosconditionCheck = new MKCalendarPosCondition(StorageManagement, _collectionRespository); //Checking that all precondition pass //Cheking Preconditions if (!await PreconditionCheck.PreconditionsOK(propertiesAndHeaders, response)) { return; } //I create here the collection already but i wait for other comprobations before save the database. await CreateDefaultCalendar(propertiesAndHeaders); response.StatusCode = (int)HttpStatusCode.Created; //If it has not body and Posconditions are OK, it is created with default values. if (string.IsNullOrEmpty(body)) { if (!await PosconditionCheck.PosconditionOk(propertiesAndHeaders, response)) { await DeleteCalendarCollection(propertiesAndHeaders, response); response.StatusCode = (int)HttpStatusCode.Forbidden; await response.WriteAsync("Poscondition Failed"); return; } await _collectionRespository.SaveChangeAsync(); return; } //If a body exist the it is parsed like an XmlTree var mkCalendarTree = XmlTreeStructure.Parse(body); //if it does not have set property it is treated as a empty body. if (mkCalendarTree.Children.Count == 0) { if (!await PosconditionCheck.PosconditionOk(propertiesAndHeaders, response)) { await DeleteCalendarCollection(propertiesAndHeaders, response); response.StatusCode = (int)HttpStatusCode.Forbidden; await response.WriteAsync("Poscondition Failed"); return; } await _collectionRespository.SaveChangeAsync(); return; } //now it is assumed that the body contains a set var setTree = mkCalendarTree.GetChild("set"); #region Response Construction in case of error //this only if error during processing. //Creating and filling the root of the xml tree response //All response of a request is conformed by a "multistatus" element. var multistatus = new XmlTreeStructure("multistatus", "DAV:"); multistatus.Namespaces.Add("D", "DAV:"); multistatus.Namespaces.Add("C", "urn:ietf:params:xml:ns:caldav"); var responseTree = new XmlTreeStructure("response", "DAV:"); multistatus.AddChild(responseTree); var href = new XmlTreeStructure("href", "DAV:"); href.AddValue(SystemProperties._baseUrl + url); #endregion //Check if any error occurred during body processing. var hasError = await BuiltResponseForSet(url, null, false, setTree, responseTree); if (hasError) { await DeleteCalendarCollection(propertiesAndHeaders, response); response.ContentType = "application/xml"; ChangeToDependencyError(responseTree); response.StatusCode = 207; await response.WriteAsync(multistatus.ToString()); return; } //Checking Preconditions if (await PosconditionCheck.PosconditionOk(propertiesAndHeaders, response)) { await _collectionRespository.SaveChangeAsync(); return; // return createdMessage; } await DeleteCalendarCollection(propertiesAndHeaders, response); response.StatusCode = (int)HttpStatusCode.Forbidden; await response.WriteAsync("Poscondition Failed"); }