|
16 | 16 |
|
17 | 17 | package org.springframework.http.codec; |
18 | 18 |
|
19 | | -import java.lang.reflect.InvocationTargetException; |
20 | | -import java.lang.reflect.Method; |
21 | | -import java.nio.charset.StandardCharsets; |
22 | | -import java.util.Arrays; |
23 | | -import java.util.Collections; |
24 | | -import java.util.List; |
25 | | -import java.util.Map; |
26 | | - |
27 | 19 | import org.junit.jupiter.api.Test; |
28 | 20 | import org.mockito.ArgumentCaptor; |
29 | 21 | import org.mockito.Mock; |
30 | 22 | import org.mockito.junit.jupiter.MockitoSettings; |
31 | 23 | import org.mockito.quality.Strictness; |
32 | | -import reactor.core.publisher.Flux; |
33 | | -import reactor.core.publisher.Mono; |
34 | | -import reactor.test.StepVerifier; |
35 | | - |
| 24 | +import org.springframework.core.ResolvableType; |
36 | 25 | import org.springframework.core.codec.CharSequenceEncoder; |
| 26 | +import org.springframework.core.codec.Encoder; |
37 | 27 | import org.springframework.core.io.buffer.DataBuffer; |
38 | 28 | import org.springframework.core.io.buffer.DefaultDataBufferFactory; |
| 29 | +import org.springframework.http.HttpHeaders; |
| 30 | +import org.springframework.http.HttpMethod; |
39 | 31 | import org.springframework.http.MediaType; |
| 32 | +import org.springframework.http.ReactiveHttpOutputMessage; |
40 | 33 | import org.springframework.util.MimeType; |
41 | 34 | import org.springframework.util.MimeTypeUtils; |
42 | 35 | import org.springframework.util.ReflectionUtils; |
| 36 | +import org.springframework.web.testfixture.http.client.reactive.MockClientHttpRequest; |
43 | 37 | import org.springframework.web.testfixture.http.server.reactive.MockServerHttpResponse; |
| 38 | +import reactor.core.publisher.Flux; |
| 39 | +import reactor.core.publisher.Mono; |
| 40 | +import reactor.test.StepVerifier; |
| 41 | + |
| 42 | +import java.lang.reflect.InvocationTargetException; |
| 43 | +import java.lang.reflect.Method; |
| 44 | +import java.nio.charset.StandardCharsets; |
| 45 | +import java.util.Arrays; |
| 46 | +import java.util.Collections; |
| 47 | +import java.util.List; |
| 48 | +import java.util.Map; |
44 | 49 |
|
45 | 50 | import static java.nio.charset.StandardCharsets.ISO_8859_1; |
46 | 51 | import static java.nio.charset.StandardCharsets.UTF_8; |
@@ -199,6 +204,35 @@ void isStreamingMediaType() throws InvocationTargetException, IllegalAccessExcep |
199 | 204 | assertThat((Boolean) method.invoke(writer, TEXT_HTML)).isFalse(); |
200 | 205 | } |
201 | 206 |
|
| 207 | + @Test |
| 208 | + public void ifBodyPublisherEmpty_noContentTypeHeader() { |
| 209 | + Encoder<CharSequence> encoder = CharSequenceEncoder.textPlainOnly(); |
| 210 | + EncoderHttpMessageWriter<CharSequence> writer = new EncoderHttpMessageWriter<>(encoder); |
| 211 | + ReactiveHttpOutputMessage outputMessage = new MockClientHttpRequest(HttpMethod.POST, "/"); |
| 212 | + Mono<Void> writerMono = writer.write(Mono.empty(), ResolvableType.forClass(String.class), |
| 213 | + null, outputMessage, NO_HINTS); |
| 214 | + |
| 215 | + StepVerifier.create(writerMono) |
| 216 | + .verifyComplete(); |
| 217 | + assertThat(outputMessage.getHeaders()).doesNotContainKey(HttpHeaders.CONTENT_TYPE); |
| 218 | + } |
| 219 | + |
| 220 | + @Test |
| 221 | + public void ifBodyPublisherEmpty_contentLengthZero() { |
| 222 | + Encoder<CharSequence> encoder = CharSequenceEncoder.textPlainOnly(); |
| 223 | + EncoderHttpMessageWriter<CharSequence> writer = new EncoderHttpMessageWriter<>(encoder); |
| 224 | + ReactiveHttpOutputMessage outputMessage = new MockClientHttpRequest(HttpMethod.POST, "/"); |
| 225 | + Mono<Void> writerMono = writer.write(Mono.empty(), ResolvableType.forClass(String.class), |
| 226 | + null, outputMessage, NO_HINTS); |
| 227 | + |
| 228 | + StepVerifier.create(writerMono) |
| 229 | + .verifyComplete(); |
| 230 | + List<String> contentLengthValues = outputMessage.getHeaders().get(HttpHeaders.CONTENT_LENGTH); |
| 231 | + assertThat(contentLengthValues).hasSize(1); |
| 232 | + int contentLength = Integer.parseInt(contentLengthValues.get(0)); |
| 233 | + assertThat(contentLength).isEqualTo(0); |
| 234 | + } |
| 235 | + |
202 | 236 | private void configureEncoder(MimeType... mimeTypes) { |
203 | 237 | configureEncoder(Flux.empty(), mimeTypes); |
204 | 238 | } |
|
0 commit comments