Repository: ambari Updated Branches: refs/heads/branch-2.4 457ab3868 -> 42a892ac3
AMBARI-17493. TEZ UI throws URISyntaxException when search by dag name with special characters. (dipayanb) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/42a892ac Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/42a892ac Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/42a892ac Branch: refs/heads/branch-2.4 Commit: 42a892ac3b5fc678dc453c37ecd87b1c984d91ea Parents: 457ab38 Author: Dipayan Bhowmick <[email protected]> Authored: Thu Jun 30 14:52:35 2016 +0530 Committer: Dipayan Bhowmick <[email protected]> Committed: Thu Jun 30 21:58:43 2016 +0530 ---------------------------------------------------------------------- contrib/views/tez/pom.xml | 24 ++++++++ .../ambari/view/tez/rest/AtsProxyResource.java | 2 +- .../ambari/view/tez/rest/RMProxyResource.java | 2 +- .../view/tez/rest/RMRedirectResource.java | 2 +- .../ambari/view/tez/utils/ProxyHelper.java | 25 ++++----- .../ambari/view/tez/utils/ProxyHelperTest.java | 58 ++++++++++++++++++++ 6 files changed, 97 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/42a892ac/contrib/views/tez/pom.xml ---------------------------------------------------------------------- diff --git a/contrib/views/tez/pom.xml b/contrib/views/tez/pom.xml index 32d2087..4a7a038 100644 --- a/contrib/views/tez/pom.xml +++ b/contrib/views/tez/pom.xml @@ -232,6 +232,30 @@ </dependency> <dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpclient</artifactId> + <version>4.5.1</version> + </dependency> + + <dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpcore</artifactId> + <version>4.4.3</version> + </dependency> + + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.easymock</groupId> + <artifactId>easymock</artifactId> + <scope>test</scope> + </dependency> + + <dependency> <groupId>org.apache.ambari.contrib.views</groupId> <artifactId>ambari-views-utils</artifactId> <version>2.4.0.0.0</version> http://git-wip-us.apache.org/repos/asf/ambari/blob/42a892ac/contrib/views/tez/src/main/java/org/apache/ambari/view/tez/rest/AtsProxyResource.java ---------------------------------------------------------------------- diff --git a/contrib/views/tez/src/main/java/org/apache/ambari/view/tez/rest/AtsProxyResource.java b/contrib/views/tez/src/main/java/org/apache/ambari/view/tez/rest/AtsProxyResource.java index 1dd822e..9f88893 100644 --- a/contrib/views/tez/src/main/java/org/apache/ambari/view/tez/rest/AtsProxyResource.java +++ b/contrib/views/tez/src/main/java/org/apache/ambari/view/tez/rest/AtsProxyResource.java @@ -42,6 +42,6 @@ public class AtsProxyResource extends BaseProxyResource { @Override public String getProxyUrl(String endpoint, MultivaluedMap<String, String> queryParams) { String atsUrl = viewController.getActiveATSUrl(); - return String.format("%s/%s%s", atsUrl, endpoint, proxyHelper.getQueryParamsString(queryParams)); + return proxyHelper.getProxyUrl(atsUrl, endpoint, queryParams); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/42a892ac/contrib/views/tez/src/main/java/org/apache/ambari/view/tez/rest/RMProxyResource.java ---------------------------------------------------------------------- diff --git a/contrib/views/tez/src/main/java/org/apache/ambari/view/tez/rest/RMProxyResource.java b/contrib/views/tez/src/main/java/org/apache/ambari/view/tez/rest/RMProxyResource.java index d3901c9..e3b3688 100644 --- a/contrib/views/tez/src/main/java/org/apache/ambari/view/tez/rest/RMProxyResource.java +++ b/contrib/views/tez/src/main/java/org/apache/ambari/view/tez/rest/RMProxyResource.java @@ -42,6 +42,6 @@ public class RMProxyResource extends BaseProxyResource { @Override public String getProxyUrl(String endpoint, MultivaluedMap<String, String> queryParams) { String activeRMUrl = viewController.getActiveRMUrl(); - return String.format("%s/%s%s", activeRMUrl, endpoint, proxyHelper.getQueryParamsString(queryParams)); + return proxyHelper.getProxyUrl(activeRMUrl, endpoint, queryParams); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/42a892ac/contrib/views/tez/src/main/java/org/apache/ambari/view/tez/rest/RMRedirectResource.java ---------------------------------------------------------------------- diff --git a/contrib/views/tez/src/main/java/org/apache/ambari/view/tez/rest/RMRedirectResource.java b/contrib/views/tez/src/main/java/org/apache/ambari/view/tez/rest/RMRedirectResource.java index e217884..99faf88 100644 --- a/contrib/views/tez/src/main/java/org/apache/ambari/view/tez/rest/RMRedirectResource.java +++ b/contrib/views/tez/src/main/java/org/apache/ambari/view/tez/rest/RMRedirectResource.java @@ -41,6 +41,6 @@ public class RMRedirectResource extends BaseRedirectionResource { @Override public String getProxyUrl(String endpoint, MultivaluedMap<String, String> queryParams) { String activeRMUrl = viewController.getActiveRMUrl(); - return String.format("%s/%s%s", activeRMUrl, endpoint, proxyHelper.getQueryParamsString(queryParams)); + return proxyHelper.getProxyUrl(activeRMUrl, endpoint, queryParams); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/42a892ac/contrib/views/tez/src/main/java/org/apache/ambari/view/tez/utils/ProxyHelper.java ---------------------------------------------------------------------- diff --git a/contrib/views/tez/src/main/java/org/apache/ambari/view/tez/utils/ProxyHelper.java b/contrib/views/tez/src/main/java/org/apache/ambari/view/tez/utils/ProxyHelper.java index 08e371f..08eaa16 100644 --- a/contrib/views/tez/src/main/java/org/apache/ambari/view/tez/utils/ProxyHelper.java +++ b/contrib/views/tez/src/main/java/org/apache/ambari/view/tez/utils/ProxyHelper.java @@ -24,6 +24,7 @@ import org.apache.ambari.view.URLConnectionProvider; import org.apache.ambari.view.ViewContext; import org.apache.ambari.view.tez.exceptions.TezWebAppException; import org.apache.commons.io.IOUtils; +import org.apache.http.client.utils.URIBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,6 +33,7 @@ import javax.ws.rs.core.Response; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; +import java.net.URISyntaxException; import java.util.Map; import java.util.Set; @@ -79,21 +81,18 @@ public class ProxyHelper { } } - public String getQueryParamsString(MultivaluedMap<String, String> queryParameters) { + public String getProxyUrl(String baseUrl, String endPoint, MultivaluedMap<String, String> queryParameters) { Set<String> keySet = queryParameters.keySet(); - StringBuilder builder = new StringBuilder(); - if(keySet.size() > 0) - builder.append("?"); - - int count = 0; - for(String key: keySet) { - builder.append(key); - builder.append("="); - builder.append(queryParameters.getFirst(key)); - if(count < keySet.size() - 1) { - builder.append("&"); + URIBuilder builder; + try { + builder = new URIBuilder(baseUrl + "/" + endPoint); + for(String key: keySet) { + builder.addParameter(key, queryParameters.getFirst(key)); } + return builder.build().toString(); + } catch (URISyntaxException e) { + LOG.error("Failed to build a URL from the baseUrl: {} and endPoint: {}. Exception: {}", baseUrl, endPoint, e); + throw new TezWebAppException("Failed to build a URL from the baseUrl:" + baseUrl + "and endPoint: " + endPoint, e); } - return builder.toString(); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/42a892ac/contrib/views/tez/src/test/java/org/apache/ambari/view/tez/utils/ProxyHelperTest.java ---------------------------------------------------------------------- diff --git a/contrib/views/tez/src/test/java/org/apache/ambari/view/tez/utils/ProxyHelperTest.java b/contrib/views/tez/src/test/java/org/apache/ambari/view/tez/utils/ProxyHelperTest.java new file mode 100644 index 0000000..2160848 --- /dev/null +++ b/contrib/views/tez/src/test/java/org/apache/ambari/view/tez/utils/ProxyHelperTest.java @@ -0,0 +1,58 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ambari.view.tez.utils; + +import org.apache.ambari.view.ViewContext; +import org.apache.ambari.view.tez.exceptions.TezWebAppException; +import org.junit.Test; + +import javax.ws.rs.core.MultivaluedHashMap; +import javax.ws.rs.core.MultivaluedMap; + +import static org.easymock.EasyMock.createNiceMock; +import static org.junit.Assert.assertEquals; + +public class ProxyHelperTest { + @Test + public void shouldBuildURLWithNoQueryParameters() throws Exception { + ViewContext context = createNiceMock(ViewContext.class); + ProxyHelper helper = new ProxyHelper(context); + assertEquals("http://abc.com/", helper.getProxyUrl("http://abc.com", "", new MultivaluedHashMap<String, String>())); + assertEquals("http://abc.com/test/abcd", helper.getProxyUrl("http://abc.com", "test/abcd", new MultivaluedHashMap<String, String>())); + } + + @Test + public void shouldBuildURLWithQueryParametersHavingSpecialCharacters() throws Exception { + ViewContext context = createNiceMock(ViewContext.class); + ProxyHelper helper = new ProxyHelper(context); + MultivaluedMap<String, String> map = new MultivaluedHashMap<>(); + map.putSingle("data", "abcd/efgh"); + assertEquals("http://abc.com/test/abcd?data=abcd%2Fefgh", helper.getProxyUrl("http://abc.com", "test/abcd", map)); + map.putSingle("data", "abcd efgh"); + assertEquals("http://abc.com/test/abcd?data=abcd+efgh", helper.getProxyUrl("http://abc.com", "test/abcd", map)); + } + + @Test(expected = TezWebAppException.class) + public void shouldThrowExceptionIfWrongUrl() throws Exception { + ViewContext context = createNiceMock(ViewContext.class); + ProxyHelper helper = new ProxyHelper(context); + helper.getProxyUrl("####", "", new MultivaluedHashMap<String, String>()); + } + +} \ No newline at end of file
