private async Task <WebAsset> ProcessAsset(IOwinContext context, WebAsset asset) { var processedAsset = await this.webAssetProcessor.ProcessAsync(asset, context.Request); if (processedAsset.Metadata.LastModifiedAt != null) { context.Response.Headers.Append("Last-Modified", processedAsset.Metadata.LastModifiedAt.Value.ToUniversalTime().ToString("ddd, dd MMM yyyy HH:mm:ss 'GMT'", CultureInfo.InvariantCulture) ); } if (processedAsset.Metadata.ContentLength != null) { context.Response.ContentLength = processedAsset.Metadata.ContentLength; } // set content length only for buffered if (context.Response.ContentLength == null && processedAsset.Content.IsBuffered) { context.Response.ContentLength = processedAsset.Content.Buffer().Length; } this.contentTypeProvider.TryGetContentType(processedAsset.Metadata.FileName, out string contentType); context.Response.ContentType = processedAsset.Metadata.ContentType ?? contentType; var contentEncodingHeader = ContentEncodingHeader(processedAsset.Content); if (contentEncodingHeader != null) { context.Response.Headers.Append("Content-Encoding", contentEncodingHeader); } return(processedAsset); }
private static async Task WriteAssetContent(IOwinContext context, WebAsset processedAsset) { using (var assetStream = processedAsset.Content.Stream()) { await StreamUtil.CopyAsync(assetStream, context.Response.Body); } }
private bool NotModified(IOwinContext context, WebAsset asset) { if (asset.Metadata.LastModifiedAt != null) { var ifModifiedSinceHeader = context.Request.Headers["If-Modified-Since"]; if (DateTime.TryParse(ifModifiedSinceHeader ?? "", out DateTime ifModifiedSince)) { var lastModifiedNorm = NormalizeDate(asset.Metadata.LastModifiedAt.Value); var ifModifiedSinceNorm = NormalizeDate(ifModifiedSince); if (lastModifiedNorm <= ifModifiedSinceNorm) { context.Response.StatusCode = (int)HttpStatusCode.NotModified; return(true); } } } return(false); }
public async Task <WebAsset> ProcessAsync(WebAsset webAsset, IOwinRequest request) { var acceptEncoding = AcceptEncoding(request); var encoding = supportedEncodings.FirstOrDefault(x => acceptEncoding.Contains(x.Value)); if (encoding == null) { return(webAsset); } if (!this.compressFilter(webAsset)) { return(webAsset); } var encodedContent = await webAsset.Content.EncodeAsync(encoding.Value).ConfigureAwait(false); return(webAsset.WithNewContent(encodedContent)); }
public async Task <WebAsset> ProcessAsync(WebAsset content, IOwinRequest request) => await processors.Aggregate( Task.FromResult(content), async (acc, processor) => await processor.ProcessAsync(await acc, request) );
public static bool ShouldCompress(WebAsset request) => extensionToCompress.Any(ext => request.Path.EndsWith(ext, StringComparison.OrdinalIgnoreCase));