From 1bd071de7a1d47be2d2d05fbdb3eedea47078515 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 14 Oct 2016 10:18:20 -0700 Subject: [PATCH] #108 Set default mime types to compress --- samples/ResponseCompressionSample/Startup.cs | 4 +- .../CompressionProviderCollection.cs | 2 +- .../CompressionProviderFactory.cs | 6 +- .../ResponseCompressionDefaults.cs | 32 +++++++++++ .../ResponseCompressionProvider.cs | 7 ++- .../ResponseCompressionServicesExtensions.cs | 14 +++-- .../ResponseCompressionMiddlewareTest.cs | 55 ++++++------------- 7 files changed, 68 insertions(+), 52 deletions(-) create mode 100644 src/Microsoft.AspNetCore.ResponseCompression/ResponseCompressionDefaults.cs diff --git a/samples/ResponseCompressionSample/Startup.cs b/samples/ResponseCompressionSample/Startup.cs index 3e297a88ec..bd49d928ad 100644 --- a/samples/ResponseCompressionSample/Startup.cs +++ b/samples/ResponseCompressionSample/Startup.cs @@ -3,6 +3,7 @@ using System; using System.IO.Compression; +using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; @@ -23,7 +24,8 @@ namespace ResponseCompressionSample { options.Providers.Add(); options.Providers.Add(); - options.MimeTypes = new[] { "text/plain", "text/html" }; + // .Append(TItem) is only available on Core. + options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(new[] { "image/svg+xml" }); }); } diff --git a/src/Microsoft.AspNetCore.ResponseCompression/CompressionProviderCollection.cs b/src/Microsoft.AspNetCore.ResponseCompression/CompressionProviderCollection.cs index 71c6a6958f..a04e920922 100644 --- a/src/Microsoft.AspNetCore.ResponseCompression/CompressionProviderCollection.cs +++ b/src/Microsoft.AspNetCore.ResponseCompression/CompressionProviderCollection.cs @@ -41,7 +41,7 @@ namespace Microsoft.AspNetCore.ResponseCompression if (!typeof(ICompressionProvider).IsAssignableFrom(providerType)) { - throw new ArgumentException($"The provider must implement {nameof(ICompressionProvider)}", nameof(providerType)); + throw new ArgumentException($"The provider must implement {nameof(ICompressionProvider)}.", nameof(providerType)); } var factory = new CompressionProviderFactory(providerType); diff --git a/src/Microsoft.AspNetCore.ResponseCompression/CompressionProviderFactory.cs b/src/Microsoft.AspNetCore.ResponseCompression/CompressionProviderFactory.cs index 715b0dfab1..50bfd267b3 100644 --- a/src/Microsoft.AspNetCore.ResponseCompression/CompressionProviderFactory.cs +++ b/src/Microsoft.AspNetCore.ResponseCompression/CompressionProviderFactory.cs @@ -13,14 +13,14 @@ namespace Microsoft.AspNetCore.ResponseCompression /// internal class CompressionProviderFactory : ICompressionProvider { - internal CompressionProviderFactory(Type providerType) + public CompressionProviderFactory(Type providerType) { ProviderType = providerType; } - internal Type ProviderType { get; } + private Type ProviderType { get; } - internal ICompressionProvider CreateInstance(IServiceProvider serviceProvider) + public ICompressionProvider CreateInstance(IServiceProvider serviceProvider) { if (serviceProvider == null) { diff --git a/src/Microsoft.AspNetCore.ResponseCompression/ResponseCompressionDefaults.cs b/src/Microsoft.AspNetCore.ResponseCompression/ResponseCompressionDefaults.cs new file mode 100644 index 0000000000..510d18786e --- /dev/null +++ b/src/Microsoft.AspNetCore.ResponseCompression/ResponseCompressionDefaults.cs @@ -0,0 +1,32 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; + +namespace Microsoft.AspNetCore.ResponseCompression +{ + /// + /// Defaults for the ResponseCompressionMiddleware + /// + public class ResponseCompressionDefaults + { + /// + /// Default MIME types to compress responses for. + /// + // This list is not intended to be exhaustive, it's a baseline for the 90% case. + public static readonly IEnumerable MimeTypes = new[] + { + // General + "text/plain", + // Static files + "text/css", + "application/javascript", + // MVC + "text/html", + "application/xml", + "text/xml", + "application/json", + "text/json", + }; + } +} diff --git a/src/Microsoft.AspNetCore.ResponseCompression/ResponseCompressionProvider.cs b/src/Microsoft.AspNetCore.ResponseCompression/ResponseCompressionProvider.cs index 696b0f3f43..b546a6045a 100644 --- a/src/Microsoft.AspNetCore.ResponseCompression/ResponseCompressionProvider.cs +++ b/src/Microsoft.AspNetCore.ResponseCompression/ResponseCompressionProvider.cs @@ -48,11 +48,12 @@ namespace Microsoft.AspNetCore.ResponseCompression } } - if (options.Value.MimeTypes == null || !options.Value.MimeTypes.Any()) + var mimeTypes = options.Value.MimeTypes; + if (mimeTypes == null || !mimeTypes.Any()) { - throw new InvalidOperationException("No MIME types specified."); + mimeTypes = ResponseCompressionDefaults.MimeTypes; } - _mimeTypes = new HashSet(options.Value.MimeTypes, StringComparer.OrdinalIgnoreCase); + _mimeTypes = new HashSet(mimeTypes, StringComparer.OrdinalIgnoreCase); } /// diff --git a/src/Microsoft.AspNetCore.ResponseCompression/ResponseCompressionServicesExtensions.cs b/src/Microsoft.AspNetCore.ResponseCompression/ResponseCompressionServicesExtensions.cs index 6cd04a132c..8d0b1ed2b3 100644 --- a/src/Microsoft.AspNetCore.ResponseCompression/ResponseCompressionServicesExtensions.cs +++ b/src/Microsoft.AspNetCore.ResponseCompression/ResponseCompressionServicesExtensions.cs @@ -14,17 +14,19 @@ namespace Microsoft.AspNetCore.Builder public static class ResponseCompressionServicesExtensions { /// - /// Add response compression services and enable compression for responses with the given MIME types. + /// Add response compression services. /// /// The for adding services. - /// Response Content-Type MIME types to enable compression for. /// - public static IServiceCollection AddResponseCompression(this IServiceCollection services, params string[] mimeTypes) + public static IServiceCollection AddResponseCompression(this IServiceCollection services) { - return services.AddResponseCompression(options => + if (services == null) { - options.MimeTypes = mimeTypes; - }); + throw new ArgumentNullException(nameof(services)); + } + + services.TryAddSingleton(); + return services; } /// diff --git a/test/Microsoft.AspNetCore.ResponseCompression.Tests/ResponseCompressionMiddlewareTest.cs b/test/Microsoft.AspNetCore.ResponseCompression.Tests/ResponseCompressionMiddlewareTest.cs index 15f8750be1..9c26de630d 100644 --- a/test/Microsoft.AspNetCore.ResponseCompression.Tests/ResponseCompressionMiddlewareTest.cs +++ b/test/Microsoft.AspNetCore.ResponseCompression.Tests/ResponseCompressionMiddlewareTest.cs @@ -55,27 +55,6 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests CheckResponseNotCompressed(response, expectedBodyLength: 100); } - [Fact] - public void NoMimeTypes_Throws() - { - var builder = new WebHostBuilder() - .ConfigureServices(services => - { - services.AddResponseCompression(); - }) - .Configure(app => - { - app.UseResponseCompression(); - app.Run(context => - { - context.Response.ContentType = TextPlain; - return context.Response.WriteAsync(new string('a', 100)); - }); - }); - - Assert.Throws(() => new TestServer(builder)); - } - [Theory] [InlineData("text/plain")] [InlineData("text/PLAIN")] @@ -86,7 +65,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests var builder = new WebHostBuilder() .ConfigureServices(services => { - services.AddResponseCompression(TextPlain); + services.AddResponseCompression(); }) .Configure(app => { @@ -117,7 +96,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests .ConfigureServices(services => { services.Configure(options => options.Level = CompressionLevel.NoCompression); - services.AddResponseCompression(TextPlain); + services.AddResponseCompression(); }) .Configure(app => { @@ -149,7 +128,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests var builder = new WebHostBuilder() .ConfigureServices(services => { - services.AddResponseCompression(TextPlain); + services.AddResponseCompression(); }) .Configure(app => { @@ -185,7 +164,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests var builder = new WebHostBuilder() .ConfigureServices(services => { - services.AddResponseCompression(TextPlain); + services.AddResponseCompression(); }) .Configure(app => { @@ -246,9 +225,9 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests } [Fact] - public async Task Response_UnauthorizedMimeType_NotCompressed() + public async Task Response_UnknownMimeType_NotCompressed() { - var response = await InvokeMiddleware(100, requestAcceptEncodings: new string[] { "gzip" }, responseType: "text/html"); + var response = await InvokeMiddleware(100, requestAcceptEncodings: new string[] { "gzip" }, responseType: "text/custom"); CheckResponseNotCompressed(response, expectedBodyLength: 100); } @@ -323,7 +302,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests var builder = new WebHostBuilder() .ConfigureServices(services => { - services.AddResponseCompression(TextPlain); + services.AddResponseCompression(); }) .Configure(app => { @@ -360,7 +339,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests var builder = new WebHostBuilder() .ConfigureServices(services => { - services.AddResponseCompression(TextPlain); + services.AddResponseCompression(); }) .Configure(app => { @@ -397,7 +376,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests var builder = new WebHostBuilder() .ConfigureServices(services => { - services.AddResponseCompression(TextPlain); + services.AddResponseCompression(); }) .Configure(app => { @@ -444,7 +423,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests var builder = new WebHostBuilder() .ConfigureServices(services => { - services.AddResponseCompression(TextPlain); + services.AddResponseCompression(); }) .Configure(app => { @@ -497,7 +476,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests var builder = new WebHostBuilder() .ConfigureServices(services => { - services.AddResponseCompression(TextPlain); + services.AddResponseCompression(); }) .Configure(app => { @@ -563,7 +542,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests var builder = new WebHostBuilder() .ConfigureServices(services => { - services.AddResponseCompression(TextPlain); + services.AddResponseCompression(); }) .Configure(app => { @@ -619,7 +598,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests var builder = new WebHostBuilder() .ConfigureServices(services => { - services.AddResponseCompression(TextPlain); + services.AddResponseCompression(); }) .Configure(app => { @@ -653,7 +632,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests var builder = new WebHostBuilder() .ConfigureServices(services => { - services.AddResponseCompression(TextPlain); + services.AddResponseCompression(); }) .Configure(app => { @@ -696,7 +675,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests var builder = new WebHostBuilder() .ConfigureServices(services => { - services.AddResponseCompression(TextPlain); + services.AddResponseCompression(); }) .Configure(app => { @@ -739,7 +718,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests var builder = new WebHostBuilder() .ConfigureServices(services => { - services.AddResponseCompression(TextPlain); + services.AddResponseCompression(); }) .Configure(app => { @@ -780,7 +759,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests var builder = new WebHostBuilder() .ConfigureServices(services => { - services.AddResponseCompression(TextPlain); + services.AddResponseCompression(); }) .Configure(app => {