diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/amfilter/AmIpFilter.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/amfilter/AmIpFilter.java index 49eabaa..4b46327 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/amfilter/AmIpFilter.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/amfilter/AmIpFilter.java @@ -25,6 +25,7 @@ import java.net.UnknownHostException; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; @@ -45,6 +46,8 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.server.webproxy.WebAppProxyServlet; import org.apache.hadoop.yarn.util.RMHAUtils; +import org.apache.http.NameValuePair; +import org.apache.http.client.utils.URLEncodedUtils; @Public public class AmIpFilter implements Filter { @@ -136,9 +139,16 @@ public void doFilter(ServletRequest req, ServletResponse resp, LOG.debug("Remote address for request is: " + httpReq.getRemoteAddr()); } if(!getProxyAddresses().contains(httpReq.getRemoteAddr())) { - String redirectUrl = findRedirectUrl(); - redirectUrl = httpResp.encodeRedirectURL(redirectUrl + - httpReq.getRequestURI()); + StringBuilder target = new StringBuilder().append(findRedirectUrl()); + target.append(httpReq.getRequestURI()); + String queryParams = httpReq.getQueryString(); + if (queryParams != null && !queryParams.isEmpty()) { + target.append("?"); + List queryPairs = + URLEncodedUtils.parse(queryParams, null); + target.append(URLEncodedUtils.format(queryPairs, "UTF-8")); + } + String redirectUrl = httpResp.encodeRedirectURL(target.toString()); httpResp.sendRedirect(redirectUrl); return; } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/test/java/org/apache/hadoop/yarn/server/webproxy/amfilter/TestAmFilter.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/test/java/org/apache/hadoop/yarn/server/webproxy/amfilter/TestAmFilter.java index 001dcf9..e5061ee 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/test/java/org/apache/hadoop/yarn/server/webproxy/amfilter/TestAmFilter.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/test/java/org/apache/hadoop/yarn/server/webproxy/amfilter/TestAmFilter.java @@ -161,6 +161,19 @@ public void doFilter(ServletRequest servletRequest, testFilter.doFilter(request, response, chain); // address "redirect" is not in host list assertEquals("http://bogus/redirect", response.getRedirect()); + // check for query parameters + Mockito.when(request.getRequestURI()).thenReturn("/proxy/application_00_0"); + Mockito.when(request.getQueryString()).thenReturn("id=0"); + testFilter.doFilter(request, response, chain); + assertEquals("http://bogus/proxy/application_00_0?id=0", + response.getRedirect()); + // check for query parameters: encoding + Mockito.when(request.getRequestURI()).thenReturn("/proxy/application_00_0"); + Mockito.when(request.getQueryString()).thenReturn("id=0&text=' #'"); + testFilter.doFilter(request, response, chain); + assertEquals("http://bogus/proxy/application_00_0?id=0&text=%27+%23%27", + response.getRedirect()); + // "127.0.0.1" contains in host list. Without cookie Mockito.when(request.getRemoteAddr()).thenReturn("127.0.0.1"); testFilter.doFilter(request, response, chain);