YARN-1728. Workaround guice3x-undecoded pathInfo in YARN WebApp. (Yuanbo Liu via gera)

(cherry picked from commit df35ba81fe)
This commit is contained in:
Gera Shegalov 2017-02-28 09:41:54 -08:00
parent 33f4263345
commit c8b1112ed9
2 changed files with 41 additions and 0 deletions

View File

@ -21,6 +21,8 @@ package org.apache.hadoop.yarn.webapp;
import static com.google.common.base.Preconditions.checkState; import static com.google.common.base.Preconditions.checkState;
import java.io.IOException; import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
@ -115,6 +117,15 @@ public class Dispatcher extends HttpServlet {
if (pathInfo == null) { if (pathInfo == null) {
pathInfo = "/"; pathInfo = "/";
} }
// The implementation class of HttpServletRequest in
// Guice-3.0 does not decode paths that are encoded,
// decode path info here for further operation.
try {
pathInfo = new URI(pathInfo).getPath();
} catch (URISyntaxException ex) {
// Just leave it alone for compatibility.
LOG.error(pathInfo + ": Failed to decode path.", ex);
}
Controller.RequestContext rc = Controller.RequestContext rc =
injector.getInstance(Controller.RequestContext.class); injector.getInstance(Controller.RequestContext.class);
if (setCookieParams(rc, req) > 0) { if (setCookieParams(rc, req) > 0) {

View File

@ -33,6 +33,7 @@ import static org.junit.Assert.assertTrue;
import java.io.InputStream; import java.io.InputStream;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.URL; import java.net.URL;
import java.net.URLEncoder;
import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.ArrayUtils;
import org.apache.hadoop.yarn.MockApps; import org.apache.hadoop.yarn.MockApps;
@ -260,6 +261,35 @@ public class TestWebApp {
} }
} }
@Test public void testEncodedUrl() throws Exception {
WebApp app =
WebApps.$for("test", TestWebApp.class, this, "ws").start(new WebApp() {
@Override
public void setup() {
bind(MyTestJAXBContextResolver.class);
bind(MyTestWebService.class);
route("/:foo", FooController.class);
}
});
String baseUrl = baseUrl(app);
try {
// Test encoded url
String rawPath = "localhost:8080";
String encodedUrl = baseUrl + "test/" +
URLEncoder.encode(rawPath, "UTF-8");
assertEquals("foo" + rawPath, getContent(encodedUrl).trim());
rawPath = "@;%$";
encodedUrl = baseUrl + "test/" +
URLEncoder.encode(rawPath, "UTF-8");
assertEquals("foo" + rawPath, getContent(encodedUrl).trim());
} finally {
app.stop();
}
}
// This is to test the GuiceFilter should only be applied to webAppContext, // This is to test the GuiceFilter should only be applied to webAppContext,
// not to staticContext and logContext; // not to staticContext and logContext;
@Test public void testYARNWebAppContext() throws Exception { @Test public void testYARNWebAppContext() throws Exception {