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
This commit is contained in:
parent
15a6373fed
commit
9197f15a30
|
|
@ -195,13 +195,7 @@ class DefaultClientResponse implements ClientResponse {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Mono<WebClientResponseException> createException() {
|
public Mono<WebClientResponseException> createException() {
|
||||||
return DataBufferUtils.join(body(BodyExtractors.toDataBuffers()))
|
return bodyToMono(byte[].class)
|
||||||
.map(dataBuffer -> {
|
|
||||||
byte[] bytes = new byte[dataBuffer.readableByteCount()];
|
|
||||||
dataBuffer.read(bytes);
|
|
||||||
DataBufferUtils.release(dataBuffer);
|
|
||||||
return bytes;
|
|
||||||
})
|
|
||||||
.defaultIfEmpty(EMPTY)
|
.defaultIfEmpty(EMPTY)
|
||||||
.onErrorReturn(ex -> !(ex instanceof Error), EMPTY)
|
.onErrorReturn(ex -> !(ex instanceof Error), EMPTY)
|
||||||
.map(bodyBytes -> {
|
.map(bodyBytes -> {
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ import reactor.core.publisher.Flux;
|
||||||
import reactor.core.publisher.Mono;
|
import reactor.core.publisher.Mono;
|
||||||
|
|
||||||
import org.springframework.core.ParameterizedTypeReference;
|
import org.springframework.core.ParameterizedTypeReference;
|
||||||
|
import org.springframework.core.codec.ByteArrayDecoder;
|
||||||
import org.springframework.core.codec.StringDecoder;
|
import org.springframework.core.codec.StringDecoder;
|
||||||
import org.springframework.core.io.buffer.DataBuffer;
|
import org.springframework.core.io.buffer.DataBuffer;
|
||||||
import org.springframework.core.io.buffer.DefaultDataBuffer;
|
import org.springframework.core.io.buffer.DefaultDataBuffer;
|
||||||
|
|
@ -48,6 +49,7 @@ import org.springframework.util.MultiValueMap;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
||||||
|
import static org.assertj.core.api.Assertions.entry;
|
||||||
import static org.mockito.BDDMockito.given;
|
import static org.mockito.BDDMockito.given;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.springframework.web.reactive.function.BodyExtractors.toMono;
|
import static org.springframework.web.reactive.function.BodyExtractors.toMono;
|
||||||
|
|
@ -328,6 +330,29 @@ public class DefaultClientResponseTests {
|
||||||
assertThat(result.getHeaders().getContentType()).isEqualTo(MediaType.TEXT_PLAIN);
|
assertThat(result.getHeaders().getContentType()).isEqualTo(MediaType.TEXT_PLAIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void createException() {
|
||||||
|
byte[] bytes = "foo".getBytes(StandardCharsets.UTF_8);
|
||||||
|
DefaultDataBuffer dataBuffer = DefaultDataBufferFactory.sharedInstance.wrap(ByteBuffer.wrap(bytes));
|
||||||
|
Flux<DataBuffer> body = Flux.just(dataBuffer);
|
||||||
|
httpHeaders.setContentType(MediaType.TEXT_PLAIN);
|
||||||
|
given(mockResponse.getStatusCode()).willReturn(HttpStatus.NOT_FOUND);
|
||||||
|
given(mockResponse.getRawStatusCode()).willReturn(HttpStatus.NOT_FOUND.value());
|
||||||
|
given(mockResponse.getBody()).willReturn(body);
|
||||||
|
|
||||||
|
List<HttpMessageReader<?>> messageReaders = Collections.singletonList(
|
||||||
|
new DecoderHttpMessageReader<>(new ByteArrayDecoder()));
|
||||||
|
given(mockExchangeStrategies.messageReaders()).willReturn(messageReaders);
|
||||||
|
|
||||||
|
Mono<WebClientResponseException> resultMono = defaultClientResponse.createException();
|
||||||
|
WebClientResponseException exception = resultMono.block();
|
||||||
|
assertThat(exception.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND);
|
||||||
|
assertThat(exception.getMessage()).isEqualTo("404 Not Found");
|
||||||
|
assertThat(exception.getHeaders()).containsExactly(entry("Content-Type",
|
||||||
|
Collections.singletonList("text/plain")));
|
||||||
|
assertThat(exception.getResponseBodyAsByteArray()).isEqualTo(bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private void mockTextPlainResponse(Flux<DataBuffer> body) {
|
private void mockTextPlainResponse(Flux<DataBuffer> body) {
|
||||||
httpHeaders.setContentType(MediaType.TEXT_PLAIN);
|
httpHeaders.setContentType(MediaType.TEXT_PLAIN);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue