Repository: ambari Updated Branches: refs/heads/trunk 611cb6582 -> 655e8018a
AMBARI-5052. Proxied API requests do not return error details.(vbrodetskyi) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/655e8018 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/655e8018 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/655e8018 Branch: refs/heads/trunk Commit: 655e8018a3cc68eba45b0925427be35eec0ac20c Parents: 611cb65 Author: Vitaly Brodetskyi <[email protected]> Authored: Wed Mar 12 19:11:26 2014 +0200 Committer: Vitaly Brodetskyi <[email protected]> Committed: Wed Mar 12 19:11:26 2014 +0200 ---------------------------------------------------------------------- .../apache/ambari/server/proxy/ProxyService.java | 9 ++++++--- .../ambari/server/proxy/ProxyServiceTest.java | 19 +++++++++++++++---- 2 files changed, 21 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/655e8018/ambari-server/src/main/java/org/apache/ambari/server/proxy/ProxyService.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/proxy/ProxyService.java b/ambari-server/src/main/java/org/apache/ambari/server/proxy/ProxyService.java index cb07a0b..30e998b 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/proxy/ProxyService.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/proxy/ProxyService.java @@ -93,15 +93,18 @@ public class ProxyService { try { HttpURLConnection connection = urlStreamProvider.processURL(url, requestType, body, getHeaderParamsToForward(headers)); int responseCode = connection.getResponseCode(); + InputStream resultInputStream = null; if (responseCode >= HTTP_ERROR_RANGE_START) { - throw new WebApplicationException(connection.getResponseCode()); + resultInputStream = connection.getErrorStream(); + } else { + resultInputStream = connection.getInputStream(); } String contentType = connection.getContentType(); Response.ResponseBuilder rb = Response.status(responseCode); if (contentType.indexOf(APPLICATION_JSON) != -1) { - rb.entity(new Gson().fromJson(new InputStreamReader(connection.getInputStream()), Map.class)); + rb.entity(new Gson().fromJson(new InputStreamReader(resultInputStream), Map.class)); } else { - rb.entity(connection.getInputStream()); + rb.entity(resultInputStream); } return rb.type(contentType).build(); } catch (IOException e) { http://git-wip-us.apache.org/repos/asf/ambari/blob/655e8018/ambari-server/src/test/java/org/apache/ambari/server/proxy/ProxyServiceTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/proxy/ProxyServiceTest.java b/ambari-server/src/test/java/org/apache/ambari/server/proxy/ProxyServiceTest.java index 9b824fd..2c1f1bc 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/proxy/ProxyServiceTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/proxy/ProxyServiceTest.java @@ -205,12 +205,15 @@ class ProxyServiceTest extends BaseServiceTest { assertSame(resultForDeleteRequest, responseMock); } - @Test(expected = WebApplicationException.class) + @Test public void testResponseWithError() throws Exception { ProxyService ps = new ProxyService(); URLStreamProvider streamProviderMock = PowerMock.createNiceMock(URLStreamProvider.class); HttpURLConnection urlConnectionMock = createMock(HttpURLConnection.class); + Response.ResponseBuilder responseBuilderMock = PowerMock.createMock(ResponseBuilderImpl.class); URI uriMock = PowerMock.createMock(URI.class); + Response responseMock = createMock(ResponseImpl.class); + InputStream es = new ByteArrayInputStream("error".getBytes()); MultivaluedMap<String, String> headerParams = new MultivaluedMapImpl(); Map<String, List<String>> headerParamsToForward = new HashMap<String, List<String>>(); headerParams.add("AmbariProxy-User-Remote","testuser"); @@ -218,16 +221,24 @@ class ProxyServiceTest extends BaseServiceTest { List<String> userRemoteParams = new LinkedList<String>(); userRemoteParams.add("testuser"); headerParamsToForward.put("User-Remote", userRemoteParams); + PowerMock.mockStatic(Response.class); expect(getHttpHeaders().getRequestHeaders()).andReturn(headerParams); expect(getHttpHeaders().getRequestHeader("AmbariProxy-User-Remote")).andReturn(userRemoteParams); expect(getUriInfo().getRequestUri()).andReturn(uriMock); expect(uriMock.getQuery()).andReturn("url=testurl"); expect(streamProviderMock.processURL("testurl", "GET", null, headerParamsToForward)).andReturn(urlConnectionMock); - expect(urlConnectionMock.getResponseCode()).andReturn(405).times(2); + expect(urlConnectionMock.getResponseCode()).andReturn(400).times(2); + expect(urlConnectionMock.getContentType()).andReturn("text/plain"); + expect(urlConnectionMock.getErrorStream()).andReturn(es); + expect(Response.status(400)).andReturn(responseBuilderMock); + expect(responseBuilderMock.entity(es)).andReturn(responseBuilderMock); + expect(responseBuilderMock.type("text/plain")).andReturn(responseBuilderMock); + expect(responseBuilderMock.build()).andReturn(responseMock); PowerMock.expectNew(URLStreamProvider.class, 20000, 15000, null, null, null).andReturn(streamProviderMock); - PowerMock.replay(streamProviderMock, URLStreamProvider.class, uriMock, URI.class); + PowerMock.replay(streamProviderMock, URLStreamProvider.class, uriMock, URI.class, Response.class, responseBuilderMock); replay(getUriInfo(), urlConnectionMock, getHttpHeaders()); - ps.processGetRequestForwarding(getHttpHeaders(),getUriInfo()); + Response resultForErrorRequest = ps.processGetRequestForwarding(getHttpHeaders(),getUriInfo()); + assertSame(resultForErrorRequest, responseMock); } @Test
