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}."); }
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>(); }
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>(); }
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}."); }
private StoreKeyContext ConstructStoreKeyContext(HttpRequest request, ValidationModelOptions validationModelOptions) { return(new StoreKeyContext(request, validationModelOptions.Vary, validationModelOptions.VaryByAll)); }