From ab4952a959174c496a194967eb873cf119dfeab9 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Tue, 12 Jun 2012 14:54:16 -0400 Subject: [PATCH] Raise RestClientException for unknown status codes HttpStatus cannot be created with an unknown status code. If a server returns a status code that's not in the HttpStatus enum values, an IllegalArgumentException is raised. Rather than allowing it to propagate as such, this change ensures the actual exception raised is a RestClientException. Issue: SPR-9406 --- .../web/client/DefaultResponseErrorHandler.java | 15 +++++++++++++-- .../client/DefaultResponseErrorHandlerTests.java | 12 ++++++++++++ src/dist/changelog.txt | 2 +- 3 files changed, 26 insertions(+), 3 deletions(-) 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 50b291cf4ec..af0b676021c 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 @@ -45,7 +45,18 @@ public class DefaultResponseErrorHandler implements ResponseErrorHandler { * Delegates to {@link #hasError(HttpStatus)} with the response status code. */ public boolean hasError(ClientHttpResponse response) throws IOException { - return hasError(response.getStatusCode()); + return hasError(getStatusCode(response)); + } + + private HttpStatus getStatusCode(ClientHttpResponse response) throws IOException { + HttpStatus statusCode; + try { + statusCode = response.getStatusCode(); + } + catch (IllegalArgumentException ex) { + throw new RestClientException("Unknown status code [" + response.getRawStatusCode() + "]"); + } + return statusCode; } /** @@ -69,7 +80,7 @@ public class DefaultResponseErrorHandler implements ResponseErrorHandler { * and a {@link RestClientException} in other cases. */ public void handleError(ClientHttpResponse response) throws IOException { - HttpStatus statusCode = response.getStatusCode(); + HttpStatus statusCode = getStatusCode(response); HttpHeaders headers = response.getHeaders(); MediaType contentType = headers.getContentType(); Charset charset = contentType != null ? contentType.getCharSet() : null; 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 13231a431a5..36547e848fd 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 @@ -124,4 +124,16 @@ public class DefaultResponseErrorHandlerTests { verify(response); } + + // SPR-9406 + + @Test(expected=RestClientException.class) + public void unknownStatusCode() throws Exception { + expect(response.getStatusCode()).andThrow(new IllegalArgumentException("No matching constant for 999")); + expect(response.getRawStatusCode()).andReturn(999); + + replay(response); + + handler.handleError(response); + } } diff --git a/src/dist/changelog.txt b/src/dist/changelog.txt index 0ab263a1071..5b491efc365 100644 --- a/src/dist/changelog.txt +++ b/src/dist/changelog.txt @@ -7,7 +7,7 @@ Changes in version 3.2 M2 ------------------------- * spring-test module now depends on junit:junit-dep - +* raise RestClientException instead of IllegalArgumentException for unknown status codes Changes in version 3.2 M1 (2012-05-28) --------------------------------------