Skip to content

Commit

Permalink
Merge pull request #634 from lhyqy5/issue-625-output-encoding-error
Browse files Browse the repository at this point in the history
Fix #625: xml output encoding don't match writer setting
  • Loading branch information
Oren Novotny authored Mar 12, 2019
2 parents a124fb5 + 33832ff commit 4c8febe
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 3 deletions.
25 changes: 25 additions & 0 deletions Refit.Tests/XmlContentSerializerTests.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
using Xunit;

Expand Down Expand Up @@ -92,6 +94,29 @@ public async Task ShouldDeserializeFromXmlAsync()
Assert.Equal("123", dto.Identifier);
}

[Fact]
public async Task XmlEncodingShouldMatchWriterSettingAsync()
{
var encoding = Encoding.UTF7;
var serializerSettings = new XmlContentSerializerSettings
{
XmlReaderWriterSettings = new XmlReaderWriterSettings()
{
WriterSettings = new XmlWriterSettings()
{
Encoding = encoding
}
}
};
var sut = new XmlContentSerializer(serializerSettings);

var dto = BuildDto();
var content = await sut.SerializeAsync(dto);
var xml = XDocument.Parse(await content.ReadAsStringAsync());
var documentEncoding = xml.Declaration.Encoding;
Assert.Equal(encoding.WebName, documentEncoding);
}

private static Dto BuildDto()
{
var dto = new Dto
Expand Down
8 changes: 5 additions & 3 deletions Refit/XmlContentSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,14 @@ public Task<HttpContent> SerializeAsync<T>(T item)
{
var xmlSerializer = new XmlSerializer(item.GetType(), settings.XmlAttributeOverrides);

using (var output = new StringWriter())
using (var stream = new MemoryStream())
{
using (var writer = XmlWriter.Create(output, settings.XmlReaderWriterSettings.WriterSettings))
using (var writer = XmlWriter.Create(stream, settings.XmlReaderWriterSettings.WriterSettings))
{
var encoding = settings.XmlReaderWriterSettings.WriterSettings?.Encoding ?? Encoding.Unicode;
xmlSerializer.Serialize(writer, item, settings.XmlNamespaces);
var content = new StringContent(output.ToString(), Encoding.UTF8, "application/xml");
var str = encoding.GetString(stream.ToArray());
var content = new StringContent(str, encoding, "application/xml");
return Task.FromResult((HttpContent)content);
}
}
Expand Down

0 comments on commit 4c8febe

Please sign in to comment.