Browse Source

Revert "Extract path info from requests without decoding"

This reverts commit 19f869996f.
Leaving path info encoded confuses applications like Gitiles.
Trying to fix this inside of JGit was maybe the wrong solution.

Change-Id: I8df9ab6233ff513e427701c8a1a66022c19784eb
stable-3.7
Shawn Pearce 10 years ago
parent
commit
f6cff781ee
  1. 42
      org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ServletUtils.java
  2. 6
      org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/RegexPipeline.java
  3. 6
      org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/SuffixPipeline.java
  4. 43
      org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/server/ServletUtilsTest.java
  5. 6
      org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/RegexPipelineTest.java

42
org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ServletUtils.java

@ -225,48 +225,6 @@ 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, private static byte[] sendInit(byte[] content,
final HttpServletRequest req, final HttpServletResponse rsp) final HttpServletRequest req, final HttpServletResponse rsp)
throws IOException { throws IOException {

6
org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/RegexPipeline.java

@ -56,8 +56,6 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.eclipse.jgit.http.server.ServletUtils;
/** /**
* Selects requests by matching the URI against a regular expression. * Selects requests by matching the URI against a regular expression.
* <p> * <p>
@ -111,14 +109,14 @@ class RegexPipeline extends UrlPipeline {
} }
boolean match(final HttpServletRequest req) { boolean match(final HttpServletRequest req) {
final String pathInfo = ServletUtils.getEncodedPathInfo(req); final String pathInfo = req.getPathInfo();
return pathInfo != null && pattern.matcher(pathInfo).matches(); return pathInfo != null && pattern.matcher(pathInfo).matches();
} }
@Override @Override
void service(HttpServletRequest req, HttpServletResponse rsp) void service(HttpServletRequest req, HttpServletResponse rsp)
throws ServletException, IOException { throws ServletException, IOException {
final String reqInfo = ServletUtils.getEncodedPathInfo(req); final String reqInfo = req.getPathInfo();
if (reqInfo == null) { if (reqInfo == null) {
rsp.sendError(SC_NOT_FOUND); rsp.sendError(SC_NOT_FOUND);
return; return;

6
org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/glue/SuffixPipeline.java

@ -51,8 +51,6 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.eclipse.jgit.http.server.ServletUtils;
/** /**
* Selects requests by matching the suffix of the URI. * Selects requests by matching the suffix of the URI.
* <p> * <p>
@ -90,14 +88,14 @@ class SuffixPipeline extends UrlPipeline {
} }
boolean match(final HttpServletRequest req) { boolean match(final HttpServletRequest req) {
final String pathInfo = ServletUtils.getEncodedPathInfo(req); final String pathInfo = req.getPathInfo();
return pathInfo != null && pathInfo.endsWith(suffix); return pathInfo != null && pathInfo.endsWith(suffix);
} }
@Override @Override
void service(HttpServletRequest req, HttpServletResponse rsp) void service(HttpServletRequest req, HttpServletResponse rsp)
throws ServletException, IOException { throws ServletException, IOException {
String curInfo = ServletUtils.getEncodedPathInfo(req); String curInfo = req.getPathInfo();
String newPath = req.getServletPath() + curInfo; String newPath = req.getServletPath() + curInfo;
String newInfo = curInfo.substring(0, curInfo.length() - suffixLen); String newInfo = curInfo.substring(0, curInfo.length() - suffixLen);
super.service(new WrappedRequest(req, newPath, newInfo), rsp); super.service(new WrappedRequest(req, newPath, newInfo), rsp);

43
org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/server/ServletUtilsTest.java

@ -48,50 +48,7 @@ import static org.junit.Assert.assertTrue;
import org.junit.Test; import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class ServletUtilsTest { public class ServletUtilsTest {
@Test
public void emptyContextPath() {
assertEquals("/foo/bar",
ServletUtils.getEncodedPathInfo("", "/s", "/s/foo/bar"));
assertEquals("/foo%2Fbar",
ServletUtils.getEncodedPathInfo("", "/s", "/s/foo%2Fbar"));
}
public void slashContextPath() {
assertEquals("/foo/bar",
ServletUtils.getEncodedPathInfo("/", "/s", "/s/foo/bar"));
assertEquals("/foo%2Fbar",
ServletUtils.getEncodedPathInfo("/", "/s", "/s/foo%2Fbar"));
}
@Test
public void emptyServletPath() {
assertEquals("/foo/bar",
ServletUtils.getEncodedPathInfo("/c", "", "/c/foo/bar"));
assertEquals("/foo%2Fbar",
ServletUtils.getEncodedPathInfo("/c", "", "/c/foo%2Fbar"));
}
@Test
public void trailingSlashes() {
assertEquals("/foo/bar/",
ServletUtils.getEncodedPathInfo("/c", "/s", "/c/s/foo/bar/"));
assertEquals("/foo/bar/",
ServletUtils.getEncodedPathInfo("/c", "/s", "/c/s/foo/bar///"));
assertEquals("/foo%2Fbar/",
ServletUtils.getEncodedPathInfo("/c", "/s", "/c/s/foo%2Fbar/"));
assertEquals("/foo%2Fbar/", ServletUtils.getEncodedPathInfo("/c", "/s",
"/c/s/foo%2Fbar///"));
}
@Test
public void servletPathMatchesRequestPath() {
assertEquals((String) null,
ServletUtils.getEncodedPathInfo("/c", "/s", "/c/s"));
}
@Test @Test
public void testAcceptGzip() { public void testAcceptGzip() {
assertFalse(ServletUtils.acceptsGzipEncoding((String) null)); assertFalse(ServletUtils.acceptsGzipEncoding((String) null));

6
org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/RegexPipelineTest.java

@ -168,7 +168,7 @@ public class RegexPipelineTest extends HttpTestCase {
s.serveRegex("^(/c)(/d)$") s.serveRegex("^(/c)(/d)$")
.through(new RegexGroupFilter(1)) .through(new RegexGroupFilter(1))
.with(new Servlet("test2")); .with(new Servlet("test2"));
s.serveRegex("^(/e)/f.*(/g)$") s.serveRegex("^(/e)/f(/g)$")
.through(new RegexGroupFilter(2)) .through(new RegexGroupFilter(2))
.with(new Servlet("test3")); .with(new Servlet("test3"));
ctx.addServlet(new ServletHolder(s), "/*"); ctx.addServlet(new ServletHolder(s), "/*");
@ -197,12 +197,12 @@ public class RegexPipelineTest extends HttpTestCase {
assertEquals("/c", r.readLine()); assertEquals("/c", r.readLine());
assertEquals(null, r.readLine()); assertEquals(null, r.readLine());
c = ((HttpURLConnection) uri.resolve("/e/f/+/g").toURL() c = ((HttpURLConnection) uri.resolve("/e/f/g").toURL()
.openConnection()); .openConnection());
assertEquals(200, c.getResponseCode()); assertEquals(200, c.getResponseCode());
r = new BufferedReader(new InputStreamReader(c.getInputStream())); r = new BufferedReader(new InputStreamReader(c.getInputStream()));
assertEquals("test3", r.readLine()); assertEquals("test3", r.readLine());
assertEquals("/e/f/+", r.readLine()); assertEquals("/e/f", r.readLine());
assertEquals("/g", r.readLine()); assertEquals("/g", r.readLine());
assertEquals(null, r.readLine()); assertEquals(null, r.readLine());
} }

Loading…
Cancel
Save