diff --git a/src/Servers/IIS/IIS/src/Core/IISHttpContext.cs b/src/Servers/IIS/IIS/src/Core/IISHttpContext.cs index a6fbdb8d97..bfd0a13984 100644 --- a/src/Servers/IIS/IIS/src/Core/IISHttpContext.cs +++ b/src/Servers/IIS/IIS/src/Core/IISHttpContext.cs @@ -373,9 +373,20 @@ namespace Microsoft.AspNetCore.Server.IIS.Core foreach (var headerPair in HttpResponseHeaders) { var headerValues = headerPair.Value; + + if (headerPair.Value.Count == 0) + { + continue; + } + var knownHeaderIndex = HttpApiTypes.HTTP_RESPONSE_HEADER_ID.IndexOfKnownHeader(headerPair.Key); for (var i = 0; i < headerValues.Count; i++) { + if (string.IsNullOrEmpty(headerValues[i])) + { + continue; + } + var isFirst = i == 0; var headerValueBytes = Encoding.UTF8.GetBytes(headerValues[i]); fixed (byte* pHeaderValue = headerValueBytes) diff --git a/src/Servers/IIS/IIS/test/Common.FunctionalTests/Inprocess/ResponseHeaderTests.cs b/src/Servers/IIS/IIS/test/Common.FunctionalTests/Inprocess/ResponseHeaderTests.cs index ccce64873e..50675e5746 100644 --- a/src/Servers/IIS/IIS/test/Common.FunctionalTests/Inprocess/ResponseHeaderTests.cs +++ b/src/Servers/IIS/IIS/test/Common.FunctionalTests/Inprocess/ResponseHeaderTests.cs @@ -22,6 +22,15 @@ namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests.InProcess _fixture = fixture; } + [ConditionalFact] + public async Task AddEmptyHeaderSkipped() + { + var response = await _fixture.Client.GetAsync("ResponseEmptyHeaders"); + var responseText = await response.Content.ReadAsStringAsync(); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.False(response.Headers.TryGetValues("EmptyHeader", out var headerValues)); + } + [ConditionalFact] public async Task AddResponseHeaders_HeaderValuesAreSetCorrectly() { diff --git a/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Startup.cs b/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Startup.cs index 35559ddb70..fb9162ce3d 100644 --- a/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Startup.cs +++ b/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Startup.cs @@ -379,6 +379,12 @@ namespace TestSite await ctx.Response.WriteAsync("Request Complete"); } + private async Task ResponseEmptyHeaders(HttpContext ctx) + { + ctx.Response.Headers["EmptyHeader"] = ""; + await ctx.Response.WriteAsync("EmptyHeaderShouldBeSkipped"); + } + private async Task ResponseInvalidOrdering(HttpContext ctx) { if (ctx.Request.Path.Equals("/SetStatusCodeAfterWrite"))