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);
        }
Exemple #3
0
        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;
        }
Exemple #4
0
        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;
            }
        }
Exemple #15
0
        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;
            }
        }
Exemple #17
0
            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;
            }
        }
Exemple #19
0
        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;
        }
Exemple #22
0
        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;
        }
Exemple #23
0
        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);
        }
Exemple #24
0
        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;
                    }
                }
            }
        }
Exemple #25
0
        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 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;
            }
        }
Exemple #27
0
        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;
            }
            }
        }
Exemple #28
0
        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;
            }
        }
        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;
                    }
                }
            }
        }