From 2c987b0ffb3ef31350329396293a27d5372d8bf0 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 1 Dec 2011 13:33:51 +0000 Subject: [PATCH] backported DefaultResponseErrorHandler IOException fix (SPR-8713) --- .../client/DefaultResponseErrorHandler.java | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/org.springframework.web/src/main/java/org/springframework/web/client/DefaultResponseErrorHandler.java b/org.springframework.web/src/main/java/org/springframework/web/client/DefaultResponseErrorHandler.java index d1ff7d99552..2aea01f187b 100644 --- a/org.springframework.web/src/main/java/org/springframework/web/client/DefaultResponseErrorHandler.java +++ b/org.springframework.web/src/main/java/org/springframework/web/client/DefaultResponseErrorHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2002-2011 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -49,7 +49,8 @@ public class DefaultResponseErrorHandler implements ResponseErrorHandler { * Template method called from {@link #hasError(ClientHttpResponse)}. *

The default implementation checks if the given status code is * {@link org.springframework.http.HttpStatus.Series#CLIENT_ERROR CLIENT_ERROR} - * or {@link org.springframework.http.HttpStatus.Series#SERVER_ERROR SERVER_ERROR}. Can be overridden in subclasses. + * or {@link org.springframework.http.HttpStatus.Series#SERVER_ERROR SERVER_ERROR}. + * Can be overridden in subclasses. * @param statusCode the HTTP status code * @return true if the response has an error; false otherwise */ @@ -59,17 +60,16 @@ public class DefaultResponseErrorHandler implements ResponseErrorHandler { } /** - * {@inheritDoc} - *

The default implementation throws a {@link HttpClientErrorException} if the response status code is - * {@link org.springframework.http.HttpStatus.Series#CLIENT_ERROR}, a {@link HttpServerErrorException} if it is - * {@link org.springframework.http.HttpStatus.Series#SERVER_ERROR}, and a {@link RestClientException} in other - * cases. + * This default implementation throws a {@link HttpClientErrorException} if the response status code + * is {@link org.springframework.http.HttpStatus.Series#CLIENT_ERROR}, a {@link HttpServerErrorException} + * if it is {@link org.springframework.http.HttpStatus.Series#SERVER_ERROR}, + * and a {@link RestClientException} in other cases. */ public void handleError(ClientHttpResponse response) throws IOException { HttpStatus statusCode = response.getStatusCode(); MediaType contentType = response.getHeaders().getContentType(); Charset charset = contentType != null ? contentType.getCharSet() : null; - byte[] body = FileCopyUtils.copyToByteArray(response.getBody()); + byte[] body = getResponseBody(response); switch (statusCode.series()) { case CLIENT_ERROR: throw new HttpClientErrorException(statusCode, response.getStatusText(), body, charset); @@ -80,5 +80,13 @@ public class DefaultResponseErrorHandler implements ResponseErrorHandler { } } -} + private byte[] getResponseBody(ClientHttpResponse response) { + try { + return FileCopyUtils.copyToByteArray(response.getBody()); + } + catch (IOException ex) { + return new byte[0]; + } + } +}