diff --git a/spring-web/src/main/java/org/springframework/web/client/DefaultResponseErrorHandler.java b/spring-web/src/main/java/org/springframework/web/client/DefaultResponseErrorHandler.java index ff72eb1e465d..5c081ec9fade 100644 --- a/spring-web/src/main/java/org/springframework/web/client/DefaultResponseErrorHandler.java +++ b/spring-web/src/main/java/org/springframework/web/client/DefaultResponseErrorHandler.java @@ -102,12 +102,13 @@ protected boolean hasError(int unknownStatusCode) { public void handleError(ClientHttpResponse response) throws IOException { HttpStatus statusCode = HttpStatus.resolve(response.getRawStatusCode()); if (statusCode == null) { + byte[] responseBody = getResponseBody(response); String message = getErrorMessage( response.getRawStatusCode(), response.getStatusText(), - getResponseBody(response), getCharset(response)); + responseBody, getCharset(response)); throw new UnknownHttpStatusCodeException(message, response.getRawStatusCode(), response.getStatusText(), - response.getHeaders(), getResponseBody(response), getCharset(response)); + response.getHeaders(), responseBody, getCharset(response)); } handleError(response, statusCode); } diff --git a/spring-web/src/test/java/org/springframework/web/client/DefaultResponseErrorHandlerTests.java b/spring-web/src/test/java/org/springframework/web/client/DefaultResponseErrorHandlerTests.java index c5c05c48e426..1e4126f55fb5 100644 --- a/spring-web/src/test/java/org/springframework/web/client/DefaultResponseErrorHandlerTests.java +++ b/spring-web/src/test/java/org/springframework/web/client/DefaultResponseErrorHandlerTests.java @@ -32,6 +32,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.assertj.core.api.Assertions.catchThrowableOfType; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; @@ -213,6 +214,25 @@ public void bodyAvailableAfterHasErrorForUnknownStatusCode() throws Exception { } + @Test + public void bodyAvailableAfterHandlingUnknownStatusClientError() throws Exception { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.TEXT_PLAIN); + TestByteArrayInputStream body = new TestByteArrayInputStream("Hello World".getBytes(StandardCharsets.UTF_8)); + + given(response.getRawStatusCode()).willReturn(432); + given(response.getStatusText()).willReturn("Custom status code"); + given(response.getHeaders()).willReturn(headers); + given(response.getBody()).willReturn(body); + + UnknownHttpStatusCodeException caught = catchThrowableOfType(() -> handler.handleError(response), + UnknownHttpStatusCodeException.class); + + assertThat(caught.getResponseBodyAsString()).isEqualTo("Hello World"); + + } + + private static class TestByteArrayInputStream extends ByteArrayInputStream { private boolean closed;