Skip to content

Commit 24ebb5e

Browse files
committed
Use ByteArrayDecoder in DefaultClientResponse::createException
This commit changes DefaultClientResponse::createException to use the ByteArrayDecoder, instead of converting to DataBuffers and turning these into a byte array. Closes gh-27666
1 parent a439a83 commit 24ebb5e

File tree

2 files changed

+30
-7
lines changed

2 files changed

+30
-7
lines changed

spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultClientResponse.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -187,13 +187,7 @@ public <T> Mono<ResponseEntity<List<T>>> toEntityList(ParameterizedTypeReference
187187

188188
@Override
189189
public Mono<WebClientResponseException> createException() {
190-
return DataBufferUtils.join(body(BodyExtractors.toDataBuffers()))
191-
.map(dataBuffer -> {
192-
byte[] bytes = new byte[dataBuffer.readableByteCount()];
193-
dataBuffer.read(bytes);
194-
DataBufferUtils.release(dataBuffer);
195-
return bytes;
196-
})
190+
return bodyToMono(byte[].class)
197191
.defaultIfEmpty(new byte[0])
198192
.map(bodyBytes -> {
199193
HttpRequest request = this.requestSupplier.get();

spring-webflux/src/test/java/org/springframework/web/reactive/function/client/DefaultClientResponseTests.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import reactor.core.publisher.Mono;
3131

3232
import org.springframework.core.ParameterizedTypeReference;
33+
import org.springframework.core.codec.ByteArrayDecoder;
3334
import org.springframework.core.codec.StringDecoder;
3435
import org.springframework.core.io.buffer.DataBuffer;
3536
import org.springframework.core.io.buffer.DefaultDataBuffer;
@@ -48,6 +49,7 @@
4849

4950
import static org.assertj.core.api.Assertions.assertThat;
5051
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
52+
import static org.assertj.core.api.Assertions.entry;
5153
import static org.mockito.BDDMockito.given;
5254
import static org.mockito.Mockito.mock;
5355
import static org.springframework.web.reactive.function.BodyExtractors.toMono;
@@ -340,6 +342,33 @@ public void toEntityListTypeReference() {
340342
assertThat(result.getHeaders().getContentType()).isEqualTo(MediaType.TEXT_PLAIN);
341343
}
342344

345+
@Test
346+
public void createException() {
347+
DefaultDataBufferFactory factory = new DefaultDataBufferFactory();
348+
byte[] bytes = "foo".getBytes(StandardCharsets.UTF_8);
349+
DefaultDataBuffer dataBuffer = factory.wrap(ByteBuffer.wrap(bytes));
350+
Flux<DataBuffer> body = Flux.just(dataBuffer);
351+
352+
HttpHeaders httpHeaders = new HttpHeaders();
353+
httpHeaders.setContentType(MediaType.TEXT_PLAIN);
354+
given(mockResponse.getHeaders()).willReturn(httpHeaders);
355+
given(mockResponse.getStatusCode()).willReturn(HttpStatus.NOT_FOUND);
356+
given(mockResponse.getRawStatusCode()).willReturn(HttpStatus.NOT_FOUND.value());
357+
given(mockResponse.getBody()).willReturn(body);
358+
359+
List<HttpMessageReader<?>> messageReaders = Collections.singletonList(
360+
new DecoderHttpMessageReader<>(new ByteArrayDecoder()));
361+
given(mockExchangeStrategies.messageReaders()).willReturn(messageReaders);
362+
363+
Mono<WebClientResponseException> resultMono = defaultClientResponse.createException();
364+
WebClientResponseException exception = resultMono.block();
365+
assertThat(exception.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND);
366+
assertThat(exception.getMessage()).isEqualTo("404 Not Found");
367+
assertThat(exception.getHeaders()).containsExactly(entry("Content-Type",
368+
Collections.singletonList("text/plain")));
369+
assertThat(exception.getResponseBodyAsByteArray()).isEqualTo(bytes);
370+
}
371+
343372

344373
private void mockTextPlainResponse(Flux<DataBuffer> body) {
345374
HttpHeaders httpHeaders = new HttpHeaders();

0 commit comments

Comments
 (0)