|  | 
| 16 | 16 | 
 | 
| 17 | 17 | package org.springframework.web.client.support; | 
| 18 | 18 | 
 | 
|  | 19 | +import java.io.IOException; | 
| 19 | 20 | import java.io.InputStream; | 
| 20 | 21 | import java.net.URI; | 
| 21 | 22 | import java.util.ArrayList; | 
| @@ -72,30 +73,34 @@ public HttpHeaders exchangeForHeaders(HttpRequestValues values) { | 
| 72 | 73 | 		return newRequest(values).retrieve().toBodilessEntity().getHeaders(); | 
| 73 | 74 | 	} | 
| 74 | 75 | 
 | 
| 75 |  | -	@SuppressWarnings("unchecked") | 
| 76 | 76 | 	@Override | 
| 77 | 77 | 	public <T> @Nullable T exchangeForBody(HttpRequestValues values, ParameterizedTypeReference<T> bodyType) { | 
| 78 |  | -		if (bodyType.getType().equals(InputStream.class)) { | 
| 79 |  | -			return (T) newRequest(values).exchange((request, response) -> response.getBody(), false); | 
| 80 |  | -		} | 
| 81 |  | -		return newRequest(values).retrieve().body(bodyType); | 
|  | 78 | +		return (bodyType.getType().equals(InputStream.class) ? | 
|  | 79 | +				exchangeForInputStream(values) : newRequest(values).retrieve().body(bodyType)); | 
| 82 | 80 | 	} | 
| 83 | 81 | 
 | 
| 84 | 82 | 	@Override | 
| 85 | 83 | 	public ResponseEntity<Void> exchangeForBodilessEntity(HttpRequestValues values) { | 
| 86 | 84 | 		return newRequest(values).retrieve().toBodilessEntity(); | 
| 87 | 85 | 	} | 
| 88 | 86 | 
 | 
| 89 |  | -	@SuppressWarnings("unchecked") | 
| 90 | 87 | 	@Override | 
| 91 | 88 | 	public <T> ResponseEntity<T> exchangeForEntity(HttpRequestValues values, ParameterizedTypeReference<T> bodyType) { | 
| 92 |  | -		if (bodyType.getType().equals(InputStream.class)) { | 
| 93 |  | -			return (ResponseEntity<T>) newRequest(values).exchangeForRequiredValue((request, response) -> | 
| 94 |  | -					ResponseEntity.status(response.getStatusCode()) | 
| 95 |  | -							.headers(response.getHeaders()) | 
| 96 |  | -							.body(response.getBody()), false); | 
| 97 |  | -		} | 
| 98 |  | -		return newRequest(values).retrieve().toEntity(bodyType); | 
|  | 89 | +		return (bodyType.getType().equals(InputStream.class) ? | 
|  | 90 | +				exchangeForEntityInputStream(values) : newRequest(values).retrieve().toEntity(bodyType)); | 
|  | 91 | +	} | 
|  | 92 | + | 
|  | 93 | +	@SuppressWarnings("unchecked") | 
|  | 94 | +	private <T> T exchangeForInputStream(HttpRequestValues values) { | 
|  | 95 | +		return (T) newRequest(values).exchange((request, response) -> getInputStream(response), false); | 
|  | 96 | +	} | 
|  | 97 | + | 
|  | 98 | +	@SuppressWarnings("unchecked") | 
|  | 99 | +	private <T> ResponseEntity<T> exchangeForEntityInputStream(HttpRequestValues values) { | 
|  | 100 | +		return (ResponseEntity<T>) newRequest(values).exchangeForRequiredValue((request, response) -> | 
|  | 101 | +				ResponseEntity.status(response.getStatusCode()) | 
|  | 102 | +						.headers(response.getHeaders()) | 
|  | 103 | +						.body(getInputStream(response)), false); | 
| 99 | 104 | 	} | 
| 100 | 105 | 
 | 
| 101 | 106 | 	@SuppressWarnings("unchecked") | 
| @@ -157,6 +162,16 @@ else if (values.getBodyValueType() != null) { | 
| 157 | 162 | 		return bodySpec; | 
| 158 | 163 | 	} | 
| 159 | 164 | 
 | 
|  | 165 | +	private static InputStream getInputStream( | 
|  | 166 | +			RestClient.RequestHeadersSpec.ConvertibleClientHttpResponse response) throws IOException { | 
|  | 167 | + | 
|  | 168 | +		if (response.getStatusCode().isError()) { | 
|  | 169 | +			throw response.createException(); | 
|  | 170 | +		} | 
|  | 171 | +		return response.getBody(); | 
|  | 172 | +	} | 
|  | 173 | + | 
|  | 174 | + | 
| 160 | 175 | 
 | 
| 161 | 176 | 	/** | 
| 162 | 177 | 	 * Create a {@link RestClientAdapter} for the given {@link RestClient}. | 
|  | 
0 commit comments