#108 Set default mime types to compress
This commit is contained in:
parent
e7b41c4f53
commit
1bd071de7a
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.IO.Compression;
|
using System.IO.Compression;
|
||||||
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
|
|
@ -23,7 +24,8 @@ namespace ResponseCompressionSample
|
||||||
{
|
{
|
||||||
options.Providers.Add<GzipCompressionProvider>();
|
options.Providers.Add<GzipCompressionProvider>();
|
||||||
options.Providers.Add<CustomCompressionProvider>();
|
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))
|
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);
|
var factory = new CompressionProviderFactory(providerType);
|
||||||
|
|
|
||||||
|
|
@ -13,14 +13,14 @@ namespace Microsoft.AspNetCore.ResponseCompression
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal class CompressionProviderFactory : ICompressionProvider
|
internal class CompressionProviderFactory : ICompressionProvider
|
||||||
{
|
{
|
||||||
internal CompressionProviderFactory(Type providerType)
|
public CompressionProviderFactory(Type providerType)
|
||||||
{
|
{
|
||||||
ProviderType = providerType;
|
ProviderType = providerType;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal Type ProviderType { get; }
|
private Type ProviderType { get; }
|
||||||
|
|
||||||
internal ICompressionProvider CreateInstance(IServiceProvider serviceProvider)
|
public ICompressionProvider CreateInstance(IServiceProvider serviceProvider)
|
||||||
{
|
{
|
||||||
if (serviceProvider == null)
|
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 />
|
/// <inheritdoc />
|
||||||
|
|
|
||||||
|
|
@ -14,17 +14,19 @@ namespace Microsoft.AspNetCore.Builder
|
||||||
public static class ResponseCompressionServicesExtensions
|
public static class ResponseCompressionServicesExtensions
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Add response compression services and enable compression for responses with the given MIME types.
|
/// Add response compression services.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="services">The <see cref="IServiceCollection"/> for adding services.</param>
|
/// <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>
|
/// <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>
|
/// <summary>
|
||||||
|
|
|
||||||
|
|
@ -55,27 +55,6 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
|
||||||
CheckResponseNotCompressed(response, expectedBodyLength: 100);
|
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]
|
[Theory]
|
||||||
[InlineData("text/plain")]
|
[InlineData("text/plain")]
|
||||||
[InlineData("text/PLAIN")]
|
[InlineData("text/PLAIN")]
|
||||||
|
|
@ -86,7 +65,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
|
||||||
var builder = new WebHostBuilder()
|
var builder = new WebHostBuilder()
|
||||||
.ConfigureServices(services =>
|
.ConfigureServices(services =>
|
||||||
{
|
{
|
||||||
services.AddResponseCompression(TextPlain);
|
services.AddResponseCompression();
|
||||||
})
|
})
|
||||||
.Configure(app =>
|
.Configure(app =>
|
||||||
{
|
{
|
||||||
|
|
@ -117,7 +96,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
|
||||||
.ConfigureServices(services =>
|
.ConfigureServices(services =>
|
||||||
{
|
{
|
||||||
services.Configure<GzipCompressionProviderOptions>(options => options.Level = CompressionLevel.NoCompression);
|
services.Configure<GzipCompressionProviderOptions>(options => options.Level = CompressionLevel.NoCompression);
|
||||||
services.AddResponseCompression(TextPlain);
|
services.AddResponseCompression();
|
||||||
})
|
})
|
||||||
.Configure(app =>
|
.Configure(app =>
|
||||||
{
|
{
|
||||||
|
|
@ -149,7 +128,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
|
||||||
var builder = new WebHostBuilder()
|
var builder = new WebHostBuilder()
|
||||||
.ConfigureServices(services =>
|
.ConfigureServices(services =>
|
||||||
{
|
{
|
||||||
services.AddResponseCompression(TextPlain);
|
services.AddResponseCompression();
|
||||||
})
|
})
|
||||||
.Configure(app =>
|
.Configure(app =>
|
||||||
{
|
{
|
||||||
|
|
@ -185,7 +164,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
|
||||||
var builder = new WebHostBuilder()
|
var builder = new WebHostBuilder()
|
||||||
.ConfigureServices(services =>
|
.ConfigureServices(services =>
|
||||||
{
|
{
|
||||||
services.AddResponseCompression(TextPlain);
|
services.AddResponseCompression();
|
||||||
})
|
})
|
||||||
.Configure(app =>
|
.Configure(app =>
|
||||||
{
|
{
|
||||||
|
|
@ -246,9 +225,9 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[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);
|
CheckResponseNotCompressed(response, expectedBodyLength: 100);
|
||||||
}
|
}
|
||||||
|
|
@ -323,7 +302,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
|
||||||
var builder = new WebHostBuilder()
|
var builder = new WebHostBuilder()
|
||||||
.ConfigureServices(services =>
|
.ConfigureServices(services =>
|
||||||
{
|
{
|
||||||
services.AddResponseCompression(TextPlain);
|
services.AddResponseCompression();
|
||||||
})
|
})
|
||||||
.Configure(app =>
|
.Configure(app =>
|
||||||
{
|
{
|
||||||
|
|
@ -360,7 +339,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
|
||||||
var builder = new WebHostBuilder()
|
var builder = new WebHostBuilder()
|
||||||
.ConfigureServices(services =>
|
.ConfigureServices(services =>
|
||||||
{
|
{
|
||||||
services.AddResponseCompression(TextPlain);
|
services.AddResponseCompression();
|
||||||
})
|
})
|
||||||
.Configure(app =>
|
.Configure(app =>
|
||||||
{
|
{
|
||||||
|
|
@ -397,7 +376,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
|
||||||
var builder = new WebHostBuilder()
|
var builder = new WebHostBuilder()
|
||||||
.ConfigureServices(services =>
|
.ConfigureServices(services =>
|
||||||
{
|
{
|
||||||
services.AddResponseCompression(TextPlain);
|
services.AddResponseCompression();
|
||||||
})
|
})
|
||||||
.Configure(app =>
|
.Configure(app =>
|
||||||
{
|
{
|
||||||
|
|
@ -444,7 +423,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
|
||||||
var builder = new WebHostBuilder()
|
var builder = new WebHostBuilder()
|
||||||
.ConfigureServices(services =>
|
.ConfigureServices(services =>
|
||||||
{
|
{
|
||||||
services.AddResponseCompression(TextPlain);
|
services.AddResponseCompression();
|
||||||
})
|
})
|
||||||
.Configure(app =>
|
.Configure(app =>
|
||||||
{
|
{
|
||||||
|
|
@ -497,7 +476,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
|
||||||
var builder = new WebHostBuilder()
|
var builder = new WebHostBuilder()
|
||||||
.ConfigureServices(services =>
|
.ConfigureServices(services =>
|
||||||
{
|
{
|
||||||
services.AddResponseCompression(TextPlain);
|
services.AddResponseCompression();
|
||||||
})
|
})
|
||||||
.Configure(app =>
|
.Configure(app =>
|
||||||
{
|
{
|
||||||
|
|
@ -563,7 +542,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
|
||||||
var builder = new WebHostBuilder()
|
var builder = new WebHostBuilder()
|
||||||
.ConfigureServices(services =>
|
.ConfigureServices(services =>
|
||||||
{
|
{
|
||||||
services.AddResponseCompression(TextPlain);
|
services.AddResponseCompression();
|
||||||
})
|
})
|
||||||
.Configure(app =>
|
.Configure(app =>
|
||||||
{
|
{
|
||||||
|
|
@ -619,7 +598,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
|
||||||
var builder = new WebHostBuilder()
|
var builder = new WebHostBuilder()
|
||||||
.ConfigureServices(services =>
|
.ConfigureServices(services =>
|
||||||
{
|
{
|
||||||
services.AddResponseCompression(TextPlain);
|
services.AddResponseCompression();
|
||||||
})
|
})
|
||||||
.Configure(app =>
|
.Configure(app =>
|
||||||
{
|
{
|
||||||
|
|
@ -653,7 +632,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
|
||||||
var builder = new WebHostBuilder()
|
var builder = new WebHostBuilder()
|
||||||
.ConfigureServices(services =>
|
.ConfigureServices(services =>
|
||||||
{
|
{
|
||||||
services.AddResponseCompression(TextPlain);
|
services.AddResponseCompression();
|
||||||
})
|
})
|
||||||
.Configure(app =>
|
.Configure(app =>
|
||||||
{
|
{
|
||||||
|
|
@ -696,7 +675,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
|
||||||
var builder = new WebHostBuilder()
|
var builder = new WebHostBuilder()
|
||||||
.ConfigureServices(services =>
|
.ConfigureServices(services =>
|
||||||
{
|
{
|
||||||
services.AddResponseCompression(TextPlain);
|
services.AddResponseCompression();
|
||||||
})
|
})
|
||||||
.Configure(app =>
|
.Configure(app =>
|
||||||
{
|
{
|
||||||
|
|
@ -739,7 +718,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
|
||||||
var builder = new WebHostBuilder()
|
var builder = new WebHostBuilder()
|
||||||
.ConfigureServices(services =>
|
.ConfigureServices(services =>
|
||||||
{
|
{
|
||||||
services.AddResponseCompression(TextPlain);
|
services.AddResponseCompression();
|
||||||
})
|
})
|
||||||
.Configure(app =>
|
.Configure(app =>
|
||||||
{
|
{
|
||||||
|
|
@ -780,7 +759,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
|
||||||
var builder = new WebHostBuilder()
|
var builder = new WebHostBuilder()
|
||||||
.ConfigureServices(services =>
|
.ConfigureServices(services =>
|
||||||
{
|
{
|
||||||
services.AddResponseCompression(TextPlain);
|
services.AddResponseCompression();
|
||||||
})
|
})
|
||||||
.Configure(app =>
|
.Configure(app =>
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue