From dea3eb7856a22a8c07e2f4acacd4281e6141a057 Mon Sep 17 00:00:00 2001 From: Artak Mkrtchyan Date: Wed, 31 Jan 2018 17:20:29 -0800 Subject: [PATCH] Not instantiating the RequestHeaders and not relying on TypedHeaders to parse AcceptCharset --- .../Formatters/TextOutputFormatter.cs | 15 +++++++++-- .../Formatters/TextOutputFormatterTests.cs | 25 +++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.Mvc.Core/Formatters/TextOutputFormatter.cs b/src/Microsoft.AspNetCore.Mvc.Core/Formatters/TextOutputFormatter.cs index 7b8bf1def3..fb2a07a1fb 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/Formatters/TextOutputFormatter.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/Formatters/TextOutputFormatter.cs @@ -76,8 +76,8 @@ namespace Microsoft.AspNetCore.Mvc.Formatters throw new InvalidOperationException(message); } - var request = context.HttpContext.Request; - var encoding = MatchAcceptCharacterEncoding(request.GetTypedHeaders().AcceptCharset); + var acceptCharsetHeaderValues = GetAcceptCharsetHeaderValues(context); + var encoding = MatchAcceptCharacterEncoding(acceptCharsetHeaderValues); if (encoding != null) { return encoding; @@ -165,6 +165,17 @@ namespace Microsoft.AspNetCore.Mvc.Formatters /// A task which can write the response body. public abstract Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding); + internal static IList GetAcceptCharsetHeaderValues(OutputFormatterWriteContext context) + { + var request = context.HttpContext.Request; + if (StringWithQualityHeaderValue.TryParseList(request.Headers[HeaderNames.AcceptCharset], out IList result)) + { + return result; + } + + return null; + } + private string GetMediaTypeWithCharset(string mediaType, Encoding encoding) { if (string.Equals(encoding.WebName, Encoding.UTF8.WebName, StringComparison.OrdinalIgnoreCase) && diff --git a/test/Microsoft.AspNetCore.Mvc.Core.Test/Formatters/TextOutputFormatterTests.cs b/test/Microsoft.AspNetCore.Mvc.Core.Test/Formatters/TextOutputFormatterTests.cs index c81760587e..3bea160842 100644 --- a/test/Microsoft.AspNetCore.Mvc.Core.Test/Formatters/TextOutputFormatterTests.cs +++ b/test/Microsoft.AspNetCore.Mvc.Core.Test/Formatters/TextOutputFormatterTests.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; +using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; @@ -233,6 +234,30 @@ namespace Microsoft.AspNetCore.Mvc.Formatters Assert.Equal(StatusCodes.Status406NotAcceptable, context.HttpContext.Response.StatusCode); } + [Fact] + public void GetAcceptCharsetHeaderValues_Succeeds() + { + // Arrange + const string testCharsetValue = "fakeValue"; + + var formatter = new OverrideEncodingFormatter(encoding: null); + var context = new DefaultHttpContext(); + context.Request.Headers[HeaderNames.AcceptCharset] = testCharsetValue; + + var writerContext = new OutputFormatterWriteContext( + context, + new TestHttpResponseStreamWriterFactory().CreateWriter, + objectType: null, + @object: null); + + // Act + var result = TextOutputFormatter.GetAcceptCharsetHeaderValues(writerContext); + + //Assert + Assert.Equal(1, result.Count); + Assert.Equal(testCharsetValue, result.Single().Value); + } + private class TestOutputFormatter : TextOutputFormatter { public TestOutputFormatter()