public async Task ReadCalendarObjectResource(Dictionary <string, string> propertiesAndHeaders, HttpResponse response) { #region Extracting Properties string url; propertiesAndHeaders.TryGetValue("url", out url); #endregion //An easy way of accessing the headers of the http response response.GetTypedHeaders(); //StorageManagement.SetUserAndCollection(principalUrl, collectionName); //Must return the Etag header of the COR var calendarRes = _resourceRespository.Get(url); if (calendarRes == null || !StorageManagement.ExistCalendarObjectResource(url)) { response.StatusCode = (int)HttpStatusCode.NotFound; return; } var resourceBody = await StorageManagement.GetCalendarObjectResource(url); var etagProperty = calendarRes.Properties.FirstOrDefault(x => x.Name == "getetag"); if (etagProperty != null) { var etag = XmlTreeStructure.Parse(etagProperty.Value).Value; response.Headers["etag"] = etag; } await response.WriteAsync(resourceBody); }
//TODO: Poner esto en la capa de datos public async Task AddCalendarObjectResource(Dictionary <string, string> propertiesAndHeaders, HttpResponse response) { #region Extracting Properties string url; propertiesAndHeaders.TryGetValue("url", out url); string ifmatch; var ifMatchEtags = new List <string>(); propertiesAndHeaders.TryGetValue("If-Match", out ifmatch); if (ifmatch != null) { ifMatchEtags = ifmatch.Split(',').ToList(); } string ifnonematch; var ifNoneMatchEtags = new List <string>(); propertiesAndHeaders.TryGetValue("If-None-Match", out ifnonematch); if (ifnonematch != null) { ifNoneMatchEtags = ifnonematch.Split(',').ToList(); } string body; propertiesAndHeaders.TryGetValue("body", out body); #endregion //Note: calendar object resource = COR //CheckAllPreconditions PreconditionCheck = new PutPrecondition(StorageManagement, _collectionRespository, _resourceRespository); if (!await PreconditionCheck.PreconditionsOK(propertiesAndHeaders, response)) { return; } var resourceExist = await _resourceRespository.Exist(url); //If the ifmatch is included i look for the etag in the resource, but first the resource has to exist. //If all is ok and the if-match etag matches the etag in the resource then i update the resource. //If the if-match dont match then i set that the precondition failed. if (ifMatchEtags.Count > 0) { if (resourceExist) { var resource = _resourceRespository.Get(url); var resourceEtag = XmlTreeStructure.Parse(resource.Properties.FirstOrDefault(x => x.Name == "getetag")?.Value) .Value; if (ifMatchEtags.Contains(resourceEtag)) { await UpdateCalendarObjectResource(propertiesAndHeaders, response); return; } response.StatusCode = (int)HttpStatusCode.PreconditionFailed; return; } } if (ifNoneMatchEtags.Count > 0 && ifNoneMatchEtags.Contains("*")) { if (!resourceExist) { await CreateCalendarObjectResource(propertiesAndHeaders, response); return; } response.StatusCode = (int)HttpStatusCode.PreconditionFailed; return; } if (resourceExist && StorageManagement.ExistCalendarObjectResource(url)) { await UpdateCalendarObjectResource(propertiesAndHeaders, response); return; } await CreateCalendarObjectResource(propertiesAndHeaders, response); //return HTTP 201 Created }