internal Func <HttpRequestMessage, Task <HttpResponseMessage> > GetIfMatchNoneMatch() { return((request) => { if (request.Method != HttpMethod.Get) { return null; } ICollection <EntityTagHeaderValue> noneMatchTags = request.Headers.IfNoneMatch; ICollection <EntityTagHeaderValue> matchTags = request.Headers.IfMatch; if (matchTags.Count == 0 && noneMatchTags.Count == 0) { return null; // no etag } if (matchTags.Count > 0 && noneMatchTags.Count > 0) // both if-match and if-none-match exist { return new HttpResponseMessage(HttpStatusCode.BadRequest).ToTask(); } var isNoneMatch = noneMatchTags.Count > 0; var etags = isNoneMatch ? noneMatchTags : matchTags; var resource = UriTrimmer(request.RequestUri); var headers = request.Headers.Where(h => _varyByHeaders.Any(v => v.Equals(h.Key, StringComparison.CurrentCultureIgnoreCase))); var entityTagKey = EntityTagKeyGenerator(resource, headers); // compare the Etag with the one in the cache // do conditional get. TimedEntityTagHeaderValue actualEtag = null; bool matchFound = false; if (_entityTagStore.TryGetValue(entityTagKey, out actualEtag)) { if (etags.Any(etag => etag.Tag == actualEtag.Tag)) { matchFound = true; } } return matchFound ^ isNoneMatch ? null : new NotModifiedResponse(actualEtag.ToEntityTagHeaderValue()).ToTask(); }); }
internal Func <HttpRequestMessage, Task <HttpResponseMessage> > GetIfModifiedUnmodifiedSince() { return((request) => { if (request.Method != HttpMethod.Get && request.Headers != null) { return null; } DateTimeOffset?ifModifiedSince = request.Headers.IfModifiedSince; DateTimeOffset?ifUnmodifiedSince = request.Headers.IfUnmodifiedSince; if (ifModifiedSince == null && ifUnmodifiedSince == null) { return null; // no etag } if (ifModifiedSince != null && ifUnmodifiedSince != null) // both exist { return new HttpResponseMessage(HttpStatusCode.BadRequest).ToTask(); } bool ifModified = (ifUnmodifiedSince == null); DateTimeOffset modifiedInQuestion = ifModified ? ifModifiedSince.Value : ifUnmodifiedSince.Value; var headers = request.Headers.Where(h => _varyByHeaders.Any(v => v.Equals(h.Key, StringComparison.CurrentCultureIgnoreCase))); var resource = UriTrimmer(request.RequestUri); var entityTagKey = EntityTagKeyGenerator(resource, headers); TimedEntityTagHeaderValue actualEtag = null; bool isModified = false; if (_entityTagStore.TryGetValue(entityTagKey, out actualEtag)) { isModified = actualEtag.LastModified > modifiedInQuestion; } return isModified ^ ifModified ? new NotModifiedResponse(actualEtag.ToEntityTagHeaderValue()).ToTask() : null; }); }