#108 Set default mime types to compress

This commit is contained in:
Chris R 2016-10-14 10:18:20 -07:00
parent e7b41c4f53
commit 1bd071de7a
7 changed files with 68 additions and 52 deletions

View File

@ -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<GzipCompressionProvider>();
options.Providers.Add<CustomCompressionProvider>();
options.MimeTypes = new[] { "text/plain", "text/html" };
// .Append(TItem) is only available on Core.
options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(new[] { "image/svg+xml" });
});
}

View File

@ -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);

View File

@ -13,14 +13,14 @@ namespace Microsoft.AspNetCore.ResponseCompression
/// </summary>
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)
{

View File

@ -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
{
/// <summary>
/// Defaults for the ResponseCompressionMiddleware
/// </summary>
public class ResponseCompressionDefaults
{
/// <summary>
/// Default MIME types to compress responses for.
/// </summary>
// This list is not intended to be exhaustive, it's a baseline for the 90% case.
public static readonly IEnumerable<string> MimeTypes = new[]
{
// General
"text/plain",
// Static files
"text/css",
"application/javascript",
// MVC
"text/html",
"application/xml",
"text/xml",
"application/json",
"text/json",
};
}
}

View File

@ -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<string>(options.Value.MimeTypes, StringComparer.OrdinalIgnoreCase);
_mimeTypes = new HashSet<string>(mimeTypes, StringComparer.OrdinalIgnoreCase);
}
/// <inheritdoc />

View File

@ -14,17 +14,19 @@ namespace Microsoft.AspNetCore.Builder
public static class ResponseCompressionServicesExtensions
{
/// <summary>
/// Add response compression services and enable compression for responses with the given MIME types.
/// Add response compression services.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection"/> for adding services.</param>
/// <param name="mimeTypes">Response Content-Type MIME types to enable compression for.</param>
/// <returns></returns>
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<IResponseCompressionProvider, ResponseCompressionProvider>();
return services;
}
/// <summary>

View File

@ -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<InvalidOperationException>(() => 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<GzipCompressionProviderOptions>(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 =>
{