コード例 #1
0
        private void GenerateVaryHeadersOnResponse(HttpContext httpContext, ValidationModelOptions validationModelOptions)
        {
            // cfr: https://tools.ietf.org/html/rfc7231#section-7.1.4
            // Generate Vary header for response
            // The "Vary" header field in a response describes what parts of a
            // request message, aside from the method, Host header field, and
            // request target, might influence the origin server's process for
            // selecting and representing this response. The value consists of
            // either a single asterisk ("*") or a list of header field names
            // (case-insensitive).

            _logger.LogInformation("Generating Vary header.");

            var headers = httpContext.Response.Headers;

            headers.Remove(HeaderNames.Vary);

            var varyHeaderValue = validationModelOptions.VaryByAll
                ? "*"
                : string.Join(", ", validationModelOptions.Vary);

            headers[HeaderNames.Vary] = varyHeaderValue;

            _logger.LogInformation($"Vary header generated: {varyHeaderValue}.");
        }
コード例 #2
0
        public HttpCacheHeadersMiddleware(
            RequestDelegate next,
            IValidationValueStore store,
            ILoggerFactory loggerFactory,
            IOptions <ExpirationModelOptions> expirationModelOptions,
            IOptions <ValidationModelOptions> validationModelOptions)
        {
            if (loggerFactory == null)
            {
                throw new ArgumentNullException(nameof(loggerFactory));
            }

            if (validationModelOptions == null)
            {
                throw new ArgumentNullException(nameof(validationModelOptions));
            }

            if (expirationModelOptions == null)
            {
                throw new ArgumentNullException(nameof(expirationModelOptions));
            }

            _next  = next ?? throw new ArgumentNullException(nameof(next));
            _store = store ?? throw new ArgumentNullException(nameof(store));
            _expirationModelOptions = expirationModelOptions.Value;
            _validationModelOptions = validationModelOptions.Value;
            _logger = loggerFactory.CreateLogger <HttpCacheHeadersMiddleware>();
        }
コード例 #3
0
        public HttpCacheHeaderWithExclusionsMiddleware(
            RequestDelegate next,
            ILoggerFactory loggerFactory,
            IDateParser dateParser,
            IValidatorValueStore store,
            IStoreKeyGenerator storeKeyGenerator,
            IETagGenerator eTagGenerator,
            ILastModifiedInjector lastModifiedInjector,
            IOptions <ExpirationModelOptions> expirationModelOptions,
            IOptions <ValidationModelOptions> validationModelOptions,
            IOptions <ExcludedRouteModelOptions> excludedRouteModelOptions)
        {
            if (loggerFactory == null)
            {
                throw new ArgumentNullException(nameof(loggerFactory));
            }

            if (validationModelOptions == null)
            {
                throw new ArgumentNullException(nameof(validationModelOptions));
            }

            if (expirationModelOptions == null)
            {
                throw new ArgumentNullException(nameof(expirationModelOptions));
            }

            _next = next ?? throw new ArgumentNullException(nameof(next));

            _dateParser           = dateParser ?? throw new ArgumentNullException(nameof(dateParser));
            _store                = store ?? throw new ArgumentNullException(nameof(store));
            _storeKeyGenerator    = storeKeyGenerator ?? throw new ArgumentNullException(nameof(storeKeyGenerator));
            _eTagGenerator        = eTagGenerator ?? throw new ArgumentNullException(nameof(eTagGenerator));
            _lastModifiedInjector =
                lastModifiedInjector ?? throw new ArgumentNullException(nameof(lastModifiedInjector));

            _expirationModelOptions    = expirationModelOptions.Value;
            _validationModelOptions    = validationModelOptions.Value;
            _excludedRouteModelOptions = excludedRouteModelOptions.Value;

            _logger = loggerFactory.CreateLogger <HttpCacheHeadersMiddleware>();
        }
コード例 #4
0
        private async Task GenerateExpirationHeadersOnResponse(
            HttpContext httpContext,
            ExpirationModelOptions expirationModelOptions,
            ValidationModelOptions validationModelOptions)
        {
            _logger.LogInformation("Generating expiration headers.");

            var headers = httpContext.Response.Headers;

            // remove current Expires & Cache-Control headers
            headers.Remove(HeaderNames.Expires);
            headers.Remove(HeaderNames.CacheControl);

            // set expiration header (remove milliseconds)
            var expires = DateTimeOffset
                          .UtcNow
                          .AddSeconds(expirationModelOptions.MaxAge);

            var expiresValue = await _dateParser.ExpiresToString(expires);

            headers[HeaderNames.Expires] = expiresValue;

            var cacheControlHeaderValue = string.Format(
                CultureInfo.InvariantCulture,
                "{0},max-age={1}{2}{3}{4}{5}{6}{7}{8}",
                expirationModelOptions.CacheLocation.ToString().ToLowerInvariant(),
                expirationModelOptions.MaxAge,
                expirationModelOptions.SharedMaxAge == null ? null : ",s-maxage=",
                expirationModelOptions.SharedMaxAge,
                expirationModelOptions.NoStore ? ",no-store" : null,
                expirationModelOptions.NoTransform ? ",no-transform" : null,
                validationModelOptions.NoCache ? ",no-cache" : null,
                validationModelOptions.MustRevalidate ? ",must-revalidate" : null,
                validationModelOptions.ProxyRevalidate ? ",proxy-revalidate" : null);

            headers[HeaderNames.CacheControl] = cacheControlHeaderValue;

            _logger.LogInformation(
                $"Expiration headers generated. Expires: {expiresValue}. Cache-Control: {cacheControlHeaderValue}.");
        }
コード例 #5
0
 private StoreKeyContext ConstructStoreKeyContext(HttpRequest request,
                                                  ValidationModelOptions validationModelOptions)
 {
     return(new StoreKeyContext(request, validationModelOptions.Vary, validationModelOptions.VaryByAll));
 }