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:
Arjen Poutsma
2023-11-02 15:51:10 +01:00
parent ab316d9bc8
commit 6dd93d4d85
22 changed files with 206 additions and 25 deletions

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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 {

View File

@@ -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>");