summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit.http.server/src
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.jgit.http.server/src')
-rw-r--r--org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ServletUtils.java42
-rw-r--r--org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/RegexPipeline.java6
-rw-r--r--org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/SuffixPipeline.java6
3 files changed, 50 insertions, 4 deletions
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ServletUtils.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ServletUtils.java
index 8d56d84c97..035b0578c8 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ServletUtils.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ServletUtils.java
@@ -225,6 +225,48 @@ public final class ServletUtils {
}
}
+ /**
+ * Get the path info component of the request. The result is similar to
+ * {@link HttpServletRequest#getPathInfo()}, but URL-encoded characters are
+ * not decoded.
+ *
+ * @param req
+ * the incoming request.
+ * @return the same value as {@link HttpServletRequest#getPathInfo()}, but
+ * without decoding URL-encoded characters.
+ * @since 3.6
+ */
+ public static String getEncodedPathInfo(HttpServletRequest req) {
+ return getEncodedPathInfo(req.getContextPath(), req.getServletPath(),
+ req.getRequestURI());
+ }
+
+ /**
+ * Get the path info component of the request. The result is similar to
+ * {@link HttpServletRequest#getPathInfo()}, but URL-encoded characters are
+ * not decoded.
+ *
+ * @param contextPath
+ * the context path from the incoming request.
+ * @param servletPath
+ * the servlet path from the incoming request.
+ * @param requestUri
+ * the request URI from the incoming request.
+ * @return the same value as {@link HttpServletRequest#getPathInfo()}, but
+ * without decoding URL-encoded characters.
+ */
+ static String getEncodedPathInfo(String contextPath, String servletPath,
+ String requestUri) {
+ String pathInfo = requestUri.substring(contextPath.length())
+ .replaceAll("/{2,}", "/");
+ if (!pathInfo.startsWith(servletPath))
+ return null;
+ pathInfo = pathInfo.substring(servletPath.length());
+ if (pathInfo.isEmpty() && !servletPath.isEmpty())
+ return null;
+ return pathInfo;
+ }
+
private static byte[] sendInit(byte[] content,
final HttpServletRequest req, final HttpServletResponse rsp)
throws IOException {
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/RegexPipeline.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/RegexPipeline.java
index 2ef71368d0..d81f7a0c92 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/RegexPipeline.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/RegexPipeline.java
@@ -56,6 +56,8 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.http.server.ServletUtils;
+
/**
* Selects requests by matching the URI against a regular expression.
* <p>
@@ -109,14 +111,14 @@ class RegexPipeline extends UrlPipeline {
}
boolean match(final HttpServletRequest req) {
- final String pathInfo = req.getPathInfo();
+ final String pathInfo = ServletUtils.getEncodedPathInfo(req);
return pathInfo != null && pattern.matcher(pathInfo).matches();
}
@Override
void service(HttpServletRequest req, HttpServletResponse rsp)
throws ServletException, IOException {
- final String reqInfo = req.getPathInfo();
+ final String reqInfo = ServletUtils.getEncodedPathInfo(req);
if (reqInfo == null) {
rsp.sendError(SC_NOT_FOUND);
return;
diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/SuffixPipeline.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/SuffixPipeline.java
index b942016259..e9b0d6529d 100644
--- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/SuffixPipeline.java
+++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/SuffixPipeline.java
@@ -51,6 +51,8 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.http.server.ServletUtils;
+
/**
* Selects requests by matching the suffix of the URI.
* <p>
@@ -88,14 +90,14 @@ class SuffixPipeline extends UrlPipeline {
}
boolean match(final HttpServletRequest req) {
- final String pathInfo = req.getPathInfo();
+ final String pathInfo = ServletUtils.getEncodedPathInfo(req);
return pathInfo != null && pathInfo.endsWith(suffix);
}
@Override
void service(HttpServletRequest req, HttpServletResponse rsp)
throws ServletException, IOException {
- String curInfo = req.getPathInfo();
+ String curInfo = ServletUtils.getEncodedPathInfo(req);
String newPath = req.getServletPath() + curInfo;
String newInfo = curInfo.substring(0, curInfo.length() - suffixLen);
super.service(new WrappedRequest(req, newPath, newInfo), rsp);