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()