public StaticFileContext(HttpContext context, StaticFileOptions options, PathString matchUrl) { _context = context; _options = options; _matchUrl = matchUrl; _request = context.Request; _response = context.Response; _method = null; _isGet = false; _isHead = false; _subPath = PathString.Empty; _contentType = null; _fileInfo = null; _length = 0; _lastModified = new DateTime(); _etag = null; _etagQuoted = null; _lastModifiedString = null; _ifMatchState = PreconditionState.Unspecified; _ifNoneMatchState = PreconditionState.Unspecified; _ifModifiedSinceState = PreconditionState.Unspecified; _ifUnmodifiedSinceState = PreconditionState.Unspecified; _ranges = null; }
public PreconditionState GetPreconditionState() { PreconditionState matchState = _ifMatchState > _ifNoneMatchState ? _ifMatchState : _ifNoneMatchState; PreconditionState modifiedState = _ifModifiedSinceState > _ifUnmodifiedSinceState ? _ifModifiedSinceState : _ifUnmodifiedSinceState; return(matchState > modifiedState ? matchState : modifiedState); }
public StaticFileContext(IOwinContext context, StaticFileOptions options, PathString matchUrl) { _context = context; _options = options; _matchUrl = matchUrl; _request = context.Request; _response = context.Response; _method = null; _isGet = false; _isHead = false; _subPath = PathString.Empty; _contentType = null; _fileInfo = null; _length = 0; _lastModified = new DateTime(); _etag = null; _etagQuoted = null; _lastModifiedString = null; _ifMatchState = PreconditionState.Unspecified; _ifNoneMatchState = PreconditionState.Unspecified; _ifModifiedSinceState = PreconditionState.Unspecified; _ifUnmodifiedSinceState = PreconditionState.Unspecified; _ranges = null; }
private void CheckMatchPrecondition() { // RFC7232, 3.1 var ifMatch = _requestHeaders.IfMatch; if (ifMatch.Count > 0) { // see if the selected representation matches one of the ETags, or // if any of the ETags is * if (ifMatch.Any(v => v.Tag == "*" || v.Compare(_etag, true))) { _ifMatch = PreconditionState.Fulfilled; } else { _ifMatch = PreconditionState.Failed; } } var ifNoneMatch = _requestHeaders.IfNoneMatch; if (ifNoneMatch.Count > 0) { // see if the selected representation matches one of the ETags, or // if any of the ETags is * if (ifNoneMatch.Any(v => v.Tag == "*" || v.Compare(_etag, false))) { _ifNoneMatch = PreconditionState.Failed; } else { _ifNoneMatch = PreconditionState.Fulfilled; } } }
private void ComputeIfMatch() { // 14.24 If-Match var ifMatch = _request.Headers.GetCommaSeparatedValues(Constants.IfMatch); // Removes quotes if (ifMatch != null) { _ifMatchState = PreconditionState.PreconditionFailed; foreach (var segment in ifMatch) { if (segment.Equals("*", StringComparison.Ordinal) || segment.Equals(_etagOfFile, StringComparison.Ordinal)) { _ifMatchState = PreconditionState.ShouldProcess; break; } } } // 14.26 If-None-Match var ifNoneMatch = _request.Headers.GetCommaSeparatedValues(Constants.IfNoneMatch); if (ifNoneMatch != null) { _ifNoneMatchState = PreconditionState.ShouldProcess; foreach (var segment in ifNoneMatch) { if (segment.Equals("*", StringComparison.Ordinal) || segment.Equals(_etagOfFile, StringComparison.Ordinal)) { _ifNoneMatchState = PreconditionState.NotModified; break; } } } }
private void ComputeIfMatch() { // 14.24 If-Match var ifMatch = _requestHeaders.IfMatch; if (ifMatch != null && ifMatch.Any()) { _ifMatchState = PreconditionState.PreconditionFailed; foreach (var etag in ifMatch) { if (etag.Equals(EntityTagHeaderValue.Any) || etag.Compare(_etag, useStrongComparison: true)) { _ifMatchState = PreconditionState.ShouldProcess; break; } } } // 14.26 If-None-Match var ifNoneMatch = _requestHeaders.IfNoneMatch; if (ifNoneMatch != null && ifNoneMatch.Any()) { _ifNoneMatchState = PreconditionState.ShouldProcess; foreach (var etag in ifNoneMatch) { if (etag.Equals(EntityTagHeaderValue.Any) || etag.Compare(_etag, useStrongComparison: true)) { _ifNoneMatchState = PreconditionState.NotModified; break; } } } }
public StaticFileContext(HttpContext context, StaticFileOptions options, PathString matchUrl, ILogger logger, IFileProvider fileProvider, IContentTypeProvider contentTypeProvider) { _context = context; _options = options; _matchUrl = matchUrl; _request = context.Request; _response = context.Response; _logger = logger; _requestHeaders = _request.GetTypedHeaders(); _responseHeaders = _response.GetTypedHeaders(); _fileProvider = fileProvider; _contentTypeProvider = contentTypeProvider; _method = null; _isGet = false; _isHead = false; _subPath = PathString.Empty; _contentType = null; _fileInfo = null; _length = 0; _lastModified = new DateTimeOffset(); _etag = null; _ifMatchState = PreconditionState.Unspecified; _ifNoneMatchState = PreconditionState.Unspecified; _ifModifiedSinceState = PreconditionState.Unspecified; _ifUnmodifiedSinceState = PreconditionState.Unspecified; _range = null; _isRangeRequest = false; }
private void ComputeIfMatch() { // 14.24 If-Match IList<EntityTagHeaderValue> ifMatch = this.requestHeaders.IfMatch; if (ifMatch != null && ifMatch.Any()) { this.ifMatchState = PreconditionState.PreconditionFailed; foreach (EntityTagHeaderValue etag in ifMatch) { if (etag.Equals(EntityTagHeaderValue.Any) || etag.Compare(this.fileEtag, true)) { this.ifMatchState = PreconditionState.ShouldProcess; break; } } } // 14.26 If-None-Match IList<EntityTagHeaderValue> ifNoneMatch = this.requestHeaders.IfNoneMatch; if (ifNoneMatch != null && ifNoneMatch.Any()) { this.ifNoneMatchState = PreconditionState.ShouldProcess; foreach (EntityTagHeaderValue etag in ifNoneMatch) { if (etag.Equals(EntityTagHeaderValue.Any) || etag.Compare(this.fileEtag, true)) { this.ifNoneMatchState = PreconditionState.NotModified; break; } } } }
private static PreconditionState GetMaxPreconditionState(params PreconditionState[] states) { PreconditionState max = PreconditionState.Unspecified; for (int i = 0; i < states.Length; i++) { if (states[i] > max) { max = states[i]; } } return(max); }
private static PreconditionState GetMaxPreconditionState(params PreconditionState[] states) { PreconditionState max = PreconditionState.Unspecified; foreach (PreconditionState state in states) { if (state > max) { max = state; } } return max; }
public void ComprehendRequestHeaders() { string etag = _etag; string[] ifMatch = _request.GetHeaderUnmodified("If-Match"); if (ifMatch != null) { _ifMatchState = PreconditionState.PreconditionFailed; foreach (var segment in new HeaderSegmentCollection(ifMatch)) { if (segment.Data.Equals(etag, StringComparison.Ordinal)) { _ifMatchState = PreconditionState.ShouldProcess; break; } } } string[] ifNoneMatch = _request.GetHeaderUnmodified("If-None-Match"); if (ifNoneMatch != null) { _ifNoneMatchState = PreconditionState.ShouldProcess; foreach (var segment in new HeaderSegmentCollection(ifNoneMatch)) { if (segment.Data.Equals(etag, StringComparison.Ordinal)) { _ifNoneMatchState = PreconditionState.NotModified; break; } } } string ifModifiedSince = _request.GetHeader("If-Modified-Since"); if (ifModifiedSince != null) { bool matches = string.Equals(ifModifiedSince, _lastModifiedString, StringComparison.Ordinal); _ifModifiedSinceState = matches ? PreconditionState.NotModified : PreconditionState.ShouldProcess; } string ifUnmodifiedSince = _request.GetHeader("If-Unmodified-Since"); if (ifUnmodifiedSince != null) { bool matches = string.Equals(ifModifiedSince, _lastModifiedString, StringComparison.Ordinal); _ifUnmodifiedSinceState = matches ? PreconditionState.ShouldProcess : PreconditionState.PreconditionFailed; } }
/// <summary> /// Initializes a new instance of the <see cref="MediaContext"/> struct. /// </summary> /// <param name="context">The current HTTP request context.</param> public MediaContext(HttpContext context) { this.context = context; this.request = context.Request; this.response = context.Response; this.requestHeaders = context.Request.GetTypedHeaders(); this.responseHeaders = context.Response.GetTypedHeaders(); this.fileLastModified = DateTimeOffset.MinValue; this.fileLength = 0; this.fileEtag = null; this.ifMatchState = PreconditionState.Unspecified; this.ifNoneMatchState = PreconditionState.Unspecified; this.ifModifiedSinceState = PreconditionState.Unspecified; this.ifUnmodifiedSinceState = PreconditionState.Unspecified; }
public StaticFileContext(IOwinContext context) { request = context.Request; response = context.Response; method = null; isGet = false; IsHeadMethod = false; contentType = null; fileInfo = null; length = 0; lastModified = default; etag = null; etagQuoted = null; lastModifiedString = null; ifMatchState = PreconditionState.Unspecified; ifNoneMatchState = PreconditionState.Unspecified; ifModifiedSinceState = PreconditionState.Unspecified; ifUnmodifiedSinceState = PreconditionState.Unspecified; }
private void ComputeIfModifiedSince() { // 14.25 If-Modified-Since var ifModifiedSinceString = _request.Headers.Get(Constants.IfModifiedSince); DateTime ifModifiedSince; if (TryParseHttpDate(ifModifiedSinceString, out ifModifiedSince)) { var modified = ifModifiedSince < _lastModifiedOfFile; _ifModifiedSinceState = modified ? PreconditionState.ShouldProcess : PreconditionState.NotModified; } // 14.28 If-Unmodified-Since var ifUnmodifiedSinceString = _request.Headers.Get(Constants.IfUnmodifiedSince); DateTime ifUnmodifiedSince; if (TryParseHttpDate(ifUnmodifiedSinceString, out ifUnmodifiedSince)) { var unmodified = ifUnmodifiedSince >= _lastModifiedOfFile; _ifUnmodifiedSinceState = unmodified ? PreconditionState.ShouldProcess : PreconditionState.PreconditionFailed; } }
private void ComputeIfModifiedSince() { // 14.25 If-Modified-Since var ifModifiedSinceString = _request.Headers.Get(Constants.IfModifiedSince); if (TryParseHttpDate(ifModifiedSinceString, out var ifModifiedSince)) { var modified = ifModifiedSince < _lastModified; _ifModifiedSinceState = modified ? PreconditionState.ShouldProcess : PreconditionState.NotModified; } // 14.28 If-Unmodified-Since var ifUnmodifiedSinceString = _request.Headers.Get(Constants.IfUnmodifiedSince); if (TryParseHttpDate(ifUnmodifiedSinceString, out var ifUnmodifiedSince)) { var unmodified = ifUnmodifiedSince >= _lastModified; _ifUnmodifiedSinceState = unmodified ? PreconditionState.ShouldProcess : PreconditionState.PreconditionFailed; } }
private void ComputeIfModifiedSince() { DateTimeOffset now = DateTimeOffset.UtcNow; // 14.25 If-Modified-Since DateTimeOffset? ifModifiedSince = this.requestHeaders.IfModifiedSince; if (ifModifiedSince.HasValue && ifModifiedSince <= now) { bool modified = ifModifiedSince < this.fileLastModified; this.ifModifiedSinceState = modified ? PreconditionState.ShouldProcess : PreconditionState.NotModified; } // 14.28 If-Unmodified-Since DateTimeOffset? ifUnmodifiedSince = this.requestHeaders.IfUnmodifiedSince; if (ifUnmodifiedSince.HasValue && ifUnmodifiedSince <= now) { bool unmodified = ifUnmodifiedSince >= this.fileLastModified; this.ifUnmodifiedSinceState = unmodified ? PreconditionState.ShouldProcess : PreconditionState.PreconditionFailed; } }
private void ComputeIfModifiedSince() { // 14.25 If-Modified-Since var ifModifiedSince = _requestHeaders.IfModifiedSince; if (ifModifiedSince.HasValue) { bool modified = ifModifiedSince < _lastModified; _ifModifiedSinceState = modified ? PreconditionState.ShouldProcess : PreconditionState.NotModified; } // 14.28 If-Unmodified-Since var ifUnmodifiedSince = _requestHeaders.IfUnmodifiedSince; if (ifUnmodifiedSince.HasValue) { bool unmodified = ifUnmodifiedSince >= _lastModified; _ifUnmodifiedSinceState = unmodified ? PreconditionState.ShouldProcess : PreconditionState.PreconditionFailed; } }
public StaticFileContext(HttpContext context, StaticFileOptions options, ILogger logger, IFileProvider fileProvider, string contentType, PathString subPath) { _context = context; _options = options; _request = context.Request; _response = context.Response; _logger = logger; _fileProvider = fileProvider; if (_fileProvider is FileResolver) { ((FileResolver)_fileProvider).Context = context; // TODO hack } _method = _request.Method; _contentType = contentType; _fileInfo = null; _etag = null; _requestHeaders = null; _responseHeaders = null; _range = null; _length = 0; _subPath = subPath; _lastModified = new DateTimeOffset(); _ifMatchState = PreconditionState.Unspecified; _ifNoneMatchState = PreconditionState.Unspecified; _ifModifiedSinceState = PreconditionState.Unspecified; _ifUnmodifiedSinceState = PreconditionState.Unspecified; if (HttpMethods.IsGet(_method)) { _requestType = RequestType.IsGet; } else if (HttpMethods.IsHead(_method)) { _requestType = RequestType.IsHead; } else { _requestType = RequestType.Unspecified; } }
public StaticFileContext(IOwinContext context) { _context = context; _request = context.Request; _response = context.Response; _method = null; _isGet = false; IsHeadMethod = false; _contentType = null; _fileInfo = null; _length = 0; _lastModified = new DateTime(); _etag = null; _etagQuoted = null; _lastModifiedString = null; _ifMatchState = PreconditionState.Unspecified; _ifNoneMatchState = PreconditionState.Unspecified; _ifModifiedSinceState = PreconditionState.Unspecified; _ifUnmodifiedSinceState = PreconditionState.Unspecified; }
private void ComputeIfModifiedSince() { var now = DateTimeOffset.UtcNow; // 14.25 If-Modified-Since var ifModifiedSince = _requestHeaders.IfModifiedSince; if (ifModifiedSince.HasValue && ifModifiedSince <= now) { var modified = ifModifiedSince < _lastModified; _ifModifiedSinceState = modified ? PreconditionState.ShouldProcess : PreconditionState.NotModified; } // 14.28 If-Unmodified-Since var ifUnmodifiedSince = _requestHeaders.IfUnmodifiedSince; if (ifUnmodifiedSince.HasValue && ifUnmodifiedSince <= now) { var unmodified = ifUnmodifiedSince >= _lastModified; _ifUnmodifiedSinceState = unmodified ? PreconditionState.ShouldProcess : PreconditionState.PreconditionFailed; } }
public StaticFileContext(IDictionary <string, object> environment, StaticFileOptions options, string matchUrl) { _environment = environment; _options = options; _matchUrl = matchUrl; _request = new OwinRequest(environment); _response = new OwinResponse(environment); _method = null; _isGet = false; _isHead = false; _subPath = null; _contentType = null; _fileInfo = null; _length = 0; _lastModified = new DateTime(); _etag = null; _lastModifiedString = null; _ifMatchState = PreconditionState.Unspecified; _ifNoneMatchState = PreconditionState.Unspecified; _ifModifiedSinceState = PreconditionState.Unspecified; _ifUnmodifiedSinceState = PreconditionState.Unspecified; }
public StaticFileContext(IDictionary<string, object> environment, StaticFileOptions options, string matchUrl) { _environment = environment; _options = options; _matchUrl = matchUrl; _request = new OwinRequest(environment); _response = new OwinResponse(environment); _method = null; _isGet = false; _isHead = false; _subPath = null; _contentType = null; _fileInfo = null; _length = 0; _lastModified = new DateTime(); _etag = null; _lastModifiedString = null; _ifMatchState = PreconditionState.Unspecified; _ifNoneMatchState = PreconditionState.Unspecified; _ifModifiedSinceState = PreconditionState.Unspecified; _ifUnmodifiedSinceState = PreconditionState.Unspecified; }
private static PreconditionState GetEtagMatchState( IList <EntityTagHeaderValue> etagHeader, EntityTagHeaderValue etag, PreconditionState matchFoundState, PreconditionState matchNotFoundState) { if (etagHeader != null && etagHeader.Any()) { var state = matchNotFoundState; foreach (var entityTag in etagHeader) { if (entityTag.Equals(EntityTagHeaderValue.Any) || entityTag.Compare(etag, useStrongComparison: true)) { state = matchFoundState; break; } } return(state); } return(PreconditionState.Unspecified); }
private void ComputeIfMatch() { // 14.24 If-Match IList <string> ifMatch = _request.Headers.GetCommaSeparatedValues(Constants.IfMatch); // Removes quotes if (ifMatch != null) { _ifMatchState = PreconditionState.PreconditionFailed; foreach (var segment in ifMatch) { if (segment.Equals("*", StringComparison.Ordinal) || segment.Equals(_etag, StringComparison.Ordinal)) { _ifMatchState = PreconditionState.ShouldProcess; break; } } } // 14.26 If-None-Match IList <string> ifNoneMatch = _request.Headers.GetCommaSeparatedValues(Constants.IfNoneMatch); if (ifNoneMatch != null) { _ifNoneMatchState = PreconditionState.ShouldProcess; foreach (var segment in ifNoneMatch) { if (segment.Equals("*", StringComparison.Ordinal) || segment.Equals(_etag, StringComparison.Ordinal)) { _ifNoneMatchState = PreconditionState.NotModified; break; } } } }
public StaticFileContext(HttpContext context, IFileProvider fileProvider, PathString subPath) { _context = context; _request = context.Request; _response = context.Response; _fileProvider = fileProvider; string method = _request.Method; _fileInfo = null; _etag = null; _requestHeaders = null; _responseHeaders = null; _range = null; _contentType = ContentType.DEFAULT.ToValue(); _length = 0; _subPath = subPath; _lastModified = new DateTimeOffset(); _ifMatchState = PreconditionState.Unspecified; _ifNoneMatchState = PreconditionState.Unspecified; _ifModifiedSinceState = PreconditionState.Unspecified; _ifUnmodifiedSinceState = PreconditionState.Unspecified; if (HttpMethods.IsGet(method)) { _requestType = RequestType.IsGet; } else if (HttpMethods.IsHead(method)) { _requestType = RequestType.IsHead; } else { _requestType = RequestType.Unspecified; } }
private async Task SendResponseAsync(PreconditionState state, HttpContext context, EntityTagHeaderValue etag, DateTimeOffset lastModified, string contentType, IFileInfo fileInfo) { switch (state) { //304 Not Modified case PreconditionState.NotModified: { context.SetResponseHeaders(304, etag, lastModified, contentType, fileInfo.Length); break; } //416 Precondition Failded case PreconditionState.PreconditionFailed: { context.SetResponseHeaders(412, etag, lastModified, contentType, fileInfo.Length); break; } case PreconditionState.Unspecified: case PreconditionState.ShouldProcess: { //200 OK if (context.UseMethods("HEAD")) { context.SetResponseHeaders(200, etag, lastModified, contentType, fileInfo.Length); return; } IEnumerable <RangeItemHeaderValue> ranges; if (context.IsRangeRequest() && this.TryGetRanges(context, lastModified, etag, fileInfo.Length, out ranges)) { RangeItemHeaderValue range = ranges.FirstOrDefault(); //416 if (null == range) { context.SetResponseHeaders(416, etag, lastModified, contentType, fileInfo.Length); return; } else { //206 Partial Content context.SetResponseHeaders(206, etag, lastModified, contentType, fileInfo.Length, range); context.Response.GetTypedHeaders().ContentRange = new ContentRangeHeaderValue(range.From.Value, range.To.Value, fileInfo.Length); using (var stream = fileInfo.CreateReadStream()) { stream.Seek(range.From.Value, SeekOrigin.Begin); await StreamCopyOperation.CopyToAsync(stream, context.Response.Body, range.To - range.From + 1, context.RequestAborted); } return; } } //200 OK context.SetResponseHeaders(200, etag, lastModified, contentType, fileInfo.Length); using (Stream stream = fileInfo.CreateReadStream()) { await StreamCopyOperation.CopyToAsync(stream, context.Response.Body, fileInfo.Length, context.RequestAborted); } break; } } }
private void ComputeIfMatch() { // 14.24 If-Match var ifMatch = _requestHeaders.IfMatch; if (ifMatch != null && ifMatch.Any()) { _ifMatchState = PreconditionState.PreconditionFailed; foreach (var etag in ifMatch) { if (etag.Equals(EntityTagHeaderValue.Any) || etag.Equals(_etag)) { _ifMatchState = PreconditionState.ShouldProcess; break; } } } // 14.26 If-None-Match var ifNoneMatch = _requestHeaders.IfNoneMatch; if (ifNoneMatch != null && ifNoneMatch.Any()) { _ifNoneMatchState = PreconditionState.ShouldProcess; foreach (var etag in ifNoneMatch) { if (etag.Equals(EntityTagHeaderValue.Any) || etag.Equals(_etag)) { _ifNoneMatchState = PreconditionState.NotModified; break; } } } }