FIX IndexOutOfBound in redirection / forwarding
When redirecting to the next step in the GitHub
import wizard an IndexOutOfBound exception was
thrown when using relative URL in gerrit.config
for the wizard steps.
Example:
[github]
wizardFlow = repositories-next.gh => pullrequests.html
This was due to the inconsistence of requestURI
vs. contextPath. Target URI needs always to be
absolute and have contextPath as prefix of requestURI.
Change-Id: Ib5ef32378f9b351bf568aaf615b67cf864904a32
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/wizard/VelocityControllerServlet.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/wizard/VelocityControllerServlet.java
index 1e311b3..ff121ae 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/wizard/VelocityControllerServlet.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/wizard/VelocityControllerServlet.java
@@ -121,8 +121,10 @@
private void redirectToNextStep(HttpServletRequest req,
HttpServletResponse resp) throws IOException, ServletException {
- String sourcePath = req.getRequestURI();
- String sourcePage = sourcePath.substring(sourcePath.lastIndexOf('/') + 1);
+ String sourceUri = req.getRequestURI();
+ int pathPos = sourceUri.lastIndexOf('/') + 1;
+ String sourcePage = sourceUri.substring(pathPos);
+ String sourcePath = sourceUri.substring(0, pathPos);
int queryStringStart = sourcePage.indexOf('?');
if (queryStringStart > 0) {
sourcePage = sourcePage.substring(0, queryStringStart);
@@ -130,14 +132,18 @@
NextPage nextPage = githubConfig.getNextPage(sourcePage);
if (nextPage != null) {
if (nextPage.redirect) {
- resp.sendRedirect(nextPage.uri);
+ resp.sendRedirect(nextPageURL(sourcePath, nextPage));
} else {
RequestDispatcher requestDispatcher =
- req.getRequestDispatcher(nextPage.uri);
+ req.getRequestDispatcher(nextPageURL(sourcePath, nextPage));
req.setAttribute("destUrl", nextPage);
requestDispatcher.forward(req, resp);
}
}
}
+ private String nextPageURL(String sourcePath, NextPage nextPage) {
+ return nextPage.uri.startsWith("/") ? nextPage.uri
+ : sourcePath + nextPage.uri;
+ }
}