Allow repeatable writes in HttpMessageConverter
This commit ensures that the StreamingHttpOutputMessage.Body.repeatable flag is set in message converters for bodies that can be written repeatedly. Closes gh-31516 See gh-31449
This commit is contained in:
@@ -79,4 +79,18 @@ public class ByteArrayHttpMessageConverterTests {
|
||||
assertThat(outputMessage.getHeaders().getContentLength()).isEqualTo(2);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void repeatableWrites() throws IOException {
|
||||
MockHttpOutputMessage outputMessage1 = new MockHttpOutputMessage();
|
||||
byte[] body = new byte[]{0x1, 0x2};
|
||||
assertThat(converter.supportsRepeatableWrites(body)).isTrue();
|
||||
|
||||
converter.write(body, null, outputMessage1);
|
||||
assertThat(outputMessage1.getBodyAsBytes()).isEqualTo(body);
|
||||
|
||||
MockHttpOutputMessage outputMessage2 = new MockHttpOutputMessage();
|
||||
converter.write(body, null, outputMessage2);
|
||||
assertThat(outputMessage2.getBodyAsBytes()).isEqualTo(body);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -171,4 +171,19 @@ class StringHttpMessageConverterTests {
|
||||
assertThat(headers.getAcceptCharset()).isEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void repeatableWrites() throws IOException {
|
||||
MockHttpOutputMessage outputMessage1 = new MockHttpOutputMessage();
|
||||
String body = "Hello World";
|
||||
assertThat(converter.supportsRepeatableWrites(body)).isTrue();
|
||||
|
||||
converter.write(body, TEXT_PLAIN_UTF_8, outputMessage1);
|
||||
assertThat(outputMessage1.getBodyAsString()).isEqualTo(body);
|
||||
|
||||
MockHttpOutputMessage outputMessage2 = new MockHttpOutputMessage();
|
||||
converter.write(body, TEXT_PLAIN_UTF_8, outputMessage2);
|
||||
assertThat(outputMessage2.getBodyAsString()).isEqualTo(body);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -580,6 +580,22 @@ public class MappingJackson2HttpMessageConverterTests {
|
||||
assertThat(result2).contains("\"property\":\"Value2\"");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void repeatableWrites() throws IOException {
|
||||
MockHttpOutputMessage outputMessage1 = new MockHttpOutputMessage();
|
||||
MyBean body = new MyBean();
|
||||
body.setString("Foo");
|
||||
converter.write(body, null, outputMessage1);
|
||||
String result = outputMessage1.getBodyAsString(StandardCharsets.UTF_8);
|
||||
assertThat(result).contains("\"string\":\"Foo\"");
|
||||
|
||||
MockHttpOutputMessage outputMessage2 = new MockHttpOutputMessage();
|
||||
converter.write(body, null, outputMessage2);
|
||||
result = outputMessage2.getBodyAsString(StandardCharsets.UTF_8);
|
||||
assertThat(result).contains("\"string\":\"Foo\"");
|
||||
}
|
||||
|
||||
|
||||
|
||||
interface MyInterface {
|
||||
|
||||
|
||||
@@ -290,6 +290,7 @@ public class SourceHttpMessageConverterTests {
|
||||
DOMSource domSource = new DOMSource(document);
|
||||
|
||||
MockHttpOutputMessage outputMessage = new MockHttpOutputMessage();
|
||||
assertThat(converter.supportsRepeatableWrites(domSource)).isTrue();
|
||||
converter.write(domSource, null, outputMessage);
|
||||
assertThat(XmlContent.of(outputMessage.getBodyAsString(StandardCharsets.UTF_8)))
|
||||
.isSimilarTo("<root>Hello World</root>");
|
||||
@@ -305,6 +306,7 @@ public class SourceHttpMessageConverterTests {
|
||||
SAXSource saxSource = new SAXSource(new InputSource(new StringReader(xml)));
|
||||
|
||||
MockHttpOutputMessage outputMessage = new MockHttpOutputMessage();
|
||||
assertThat(converter.supportsRepeatableWrites(saxSource)).isFalse();
|
||||
converter.write(saxSource, null, outputMessage);
|
||||
assertThat(XmlContent.of(outputMessage.getBodyAsString(StandardCharsets.UTF_8)))
|
||||
.isSimilarTo("<root>Hello World</root>");
|
||||
@@ -318,6 +320,7 @@ public class SourceHttpMessageConverterTests {
|
||||
StreamSource streamSource = new StreamSource(new StringReader(xml));
|
||||
|
||||
MockHttpOutputMessage outputMessage = new MockHttpOutputMessage();
|
||||
assertThat(converter.supportsRepeatableWrites(streamSource)).isFalse();
|
||||
converter.write(streamSource, null, outputMessage);
|
||||
assertThat(XmlContent.of(outputMessage.getBodyAsString(StandardCharsets.UTF_8)))
|
||||
.isSimilarTo("<root>Hello World</root>");
|
||||
|
||||
Reference in New Issue
Block a user