#108 Set default mime types to compress
This commit is contained in:
parent
e7b41c4f53
commit
1bd071de7a
|
|
@ -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" });
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
@ -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 />
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 =>
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue