Skip to content

Commit 1a0c991

Browse files
authored
Don't force default content-type if no content (#450)
1 parent eb4126d commit 1a0c991

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

src/Microsoft.AspNetCore.SystemWebAdapters.CoreServices/SetDefaultResponseHeadersMiddleware.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public Task InvokeAsync(HttpContext context)
3232

3333
private static void WriteDefaultContentType(HttpContext context)
3434
{
35-
if (context.Response.Headers.ContentType.Count == 0)
35+
if (context.Response.ContentLength.HasValue && context.Response.Headers.ContentType.Count == 0)
3636
{
3737
context.Response.Headers.ContentType = "text/html";
3838
}

test/Microsoft.AspNetCore.SystemWebAdapters.CoreServices.Tests/SetDefaultResponseHeadersMiddlewareTests.cs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33

44
using System;
5+
using System.IO;
6+
using System.Text;
57
using System.Threading.Tasks;
68
using Microsoft.AspNetCore.Http;
79
using Microsoft.AspNetCore.Http.Features;
@@ -12,23 +14,46 @@ namespace Microsoft.AspNetCore.SystemWebAdapters.Tests;
1214
public class SetDefaultResponseHeadersMiddlewareTests
1315
{
1416
[Fact]
15-
public async Task NoHeaders()
17+
public async Task NoHeadersWithContent()
1618
{
1719
// Arrange
1820
var context = new DefaultHttpContext();
1921
var startupFeature = new StartupCallbackFeature();
2022
context.Features.Set<IHttpResponseFeature>(startupFeature);
2123
var next = Task (HttpContextCore context) => Task.CompletedTask;
2224
var middleware = new SetDefaultResponseHeadersMiddleware(new(next));
25+
var data = new MemoryStream(Encoding.UTF8.GetBytes("ArbitraryContent"));
26+
context.Response.Body = data;
27+
context.Response.ContentLength = data.Length;
2328

2429
// Act
2530
await middleware.InvokeAsync(context);
2631
await startupFeature.RunAsync();
2732

2833
// Assert
29-
Assert.Equal(2, context.Response.Headers.Count);
34+
Assert.Equal(3, context.Response.Headers.Count);
3035
Assert.Equal("text/html", context.Response.Headers.ContentType);
3136
Assert.Equal("private", context.Response.Headers.CacheControl);
37+
Assert.Equal(data.Length, context.Response.ContentLength);
38+
}
39+
40+
[Fact]
41+
public async Task NoHeadersWithoutContent()
42+
{
43+
// Arrange
44+
var context = new DefaultHttpContext();
45+
var startupFeature = new StartupCallbackFeature();
46+
context.Features.Set<IHttpResponseFeature>(startupFeature);
47+
var next = Task (HttpContextCore context) => Task.CompletedTask;
48+
var middleware = new SetDefaultResponseHeadersMiddleware(new(next));
49+
50+
// Act
51+
await middleware.InvokeAsync(context);
52+
await startupFeature.RunAsync();
53+
54+
// Assert
55+
Assert.Single(context.Response.Headers);
56+
Assert.False(context.Response.Headers.ContainsKey("Content-Type"));
3257
}
3358

3459
[Theory]

0 commit comments

Comments
 (0)