From f3c2bb65570fe40919d518995ee8a3898f03b069 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Thu, 14 Jan 2016 14:52:10 -0500 Subject: [PATCH] Fix error message in RestTemplate Issue: SPR-13860 --- .../web/client/RestTemplate.java | 5 ++- .../web/client/RestTemplateTests.java | 31 ++++++++++++------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java b/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java index 2601d2f916e..618a4048da8 100644 --- a/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java +++ b/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java @@ -603,8 +603,11 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat } } catch (IOException ex) { + String resource = url.toString(); + String query = url.getRawQuery(); + resource = (query != null ? resource.substring(0, resource.indexOf(query) - 1) : resource); throw new ResourceAccessException("I/O error on " + method.name() + - " request for \"" + url + "\": " + ex.getMessage(), ex); + " request for \"" + resource + "\": " + ex.getMessage(), ex); } finally { if (response != null) { diff --git a/spring-web/src/test/java/org/springframework/web/client/RestTemplateTests.java b/spring-web/src/test/java/org/springframework/web/client/RestTemplateTests.java index 1ecfc48e5fb..a3be48217fe 100644 --- a/spring-web/src/test/java/org/springframework/web/client/RestTemplateTests.java +++ b/spring-web/src/test/java/org/springframework/web/client/RestTemplateTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2015 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,6 +49,7 @@ import static org.mockito.BDDMockito.*; /** * @author Arjen Poutsma + * @author Rossen Stoyanchev */ @SuppressWarnings("unchecked") public class RestTemplateTests { @@ -135,7 +136,7 @@ public class RestTemplateTests { given(response.getStatusCode()).willReturn(status); given(response.getStatusText()).willReturn(status.getReasonPhrase()); - Map vars = new HashMap(2); + Map vars = new HashMap<>(2); vars.put("first", null); vars.put("last", "foo"); template.execute("http://example.com/{first}-{last}", HttpMethod.GET, null, null, vars); @@ -278,7 +279,7 @@ public class RestTemplateTests { given(response.getHeaders()).willReturn(new HttpHeaders()); given(response.getBody()).willReturn(null); - Map uriVariables = new HashMap(2); + Map uriVariables = new HashMap<>(2); uriVariables.put("hotel", "1"); uriVariables.put("publicpath", "pics/logo.png"); uriVariables.put("scale", "150x150"); @@ -351,7 +352,7 @@ public class RestTemplateTests { HttpHeaders entityHeaders = new HttpHeaders(); entityHeaders.setContentType(contentType); - HttpEntity entity = new HttpEntity(helloWorld, entityHeaders); + HttpEntity entity = new HttpEntity<>(helloWorld, entityHeaders); URI result = template.postForLocation("http://example.com", entity); assertEquals("Invalid POST result", expected, result); @@ -379,7 +380,7 @@ public class RestTemplateTests { HttpHeaders entityHeaders = new HttpHeaders(); entityHeaders.set("MyHeader", "MyValue"); - HttpEntity entity = new HttpEntity(helloWorld, entityHeaders); + HttpEntity entity = new HttpEntity<>(helloWorld, entityHeaders); URI result = template.postForLocation("http://example.com", entity); assertEquals("Invalid POST result", expected, result); @@ -622,21 +623,27 @@ public class RestTemplateTests { verify(response).close(); } + // Issue: SPR-9325, SPR-13860 + @Test public void ioException() throws Exception { + String url = "http://example.com/resource?access_token=123"; + given(converter.canRead(String.class, null)).willReturn(true); MediaType mediaType = new MediaType("foo", "bar"); given(converter.getSupportedMediaTypes()).willReturn(Collections.singletonList(mediaType)); - given(requestFactory.createRequest(new URI("http://example.com/resource"), HttpMethod.GET)).willReturn(request); + given(requestFactory.createRequest(new URI(url), HttpMethod.GET)).willReturn(request); given(request.getHeaders()).willReturn(new HttpHeaders()); - given(request.execute()).willThrow(new IOException()); + given(request.execute()).willThrow(new IOException("Socket failure")); try { - template.getForObject("http://example.com/resource", String.class); + template.getForObject(url, String.class); fail("RestClientException expected"); } catch (ResourceAccessException ex) { - // expected + assertEquals("I/O error on GET request for \"http://example.com/resource\": " + + "Socket failure; nested exception is java.io.IOException: Socket failure", + ex.getMessage()); } } @@ -669,7 +676,7 @@ public class RestTemplateTests { HttpHeaders entityHeaders = new HttpHeaders(); entityHeaders.set("MyHeader", "MyValue"); - HttpEntity requestEntity = new HttpEntity(body, entityHeaders); + HttpEntity requestEntity = new HttpEntity<>(body, entityHeaders); ResponseEntity result = template.exchange("http://example.com", HttpMethod.POST, requestEntity, Integer.class); assertEquals("Invalid POST result", expected, result.getBody()); assertEquals("Invalid Content-Type", MediaType.TEXT_PLAIN, result.getHeaders().getContentType()); @@ -703,7 +710,7 @@ public class RestTemplateTests { responseHeaders.setContentLength(10); given(response.getStatusCode()).willReturn(HttpStatus.OK); given(response.getHeaders()).willReturn(responseHeaders); - given(response.getBody()).willReturn(new ByteArrayInputStream(new Integer(42).toString().getBytes())); + given(response.getBody()).willReturn(new ByteArrayInputStream(Integer.toString(42).getBytes())); given(converter.canRead(intList.getType(), null, MediaType.TEXT_PLAIN)).willReturn(true); given(converter.read(eq(intList.getType()), eq(null), any(HttpInputMessage.class))).willReturn(expected); given(response.getStatusCode()).willReturn(HttpStatus.OK); @@ -713,7 +720,7 @@ public class RestTemplateTests { HttpHeaders entityHeaders = new HttpHeaders(); entityHeaders.set("MyHeader", "MyValue"); - HttpEntity requestEntity = new HttpEntity(requestBody, entityHeaders); + HttpEntity requestEntity = new HttpEntity<>(requestBody, entityHeaders); ResponseEntity> result = template.exchange("http://example.com", HttpMethod.POST, requestEntity, intList); assertEquals("Invalid POST result", expected, result.getBody()); assertEquals("Invalid Content-Type", MediaType.TEXT_PLAIN, result.getHeaders().getContentType());