From de16d5e8f98610e253d46e25a39ee4edfca23b92 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Wed, 4 May 2011 14:55:53 -0700 Subject: [PATCH] Fix error handling in RepositoryFilter The filter did not correctly match smart HTTP client requests, so it always fell back on HTTP status codes for errors. This usually causes a smart client to retry a dumb request, which is not what the server wants. Change-Id: I42592378dc42fbe308ef30a2923786c690f668a9 Signed-off-by: Shawn O. Pearce --- .../org/eclipse/jgit/http/server/RepositoryFilter.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/RepositoryFilter.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/RepositoryFilter.java index 3e0a57256..146259385 100644 --- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/RepositoryFilter.java +++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/RepositoryFilter.java @@ -154,10 +154,8 @@ public class RepositoryFilter implements Filter { static void sendError(int statusCode, HttpServletRequest req, HttpServletResponse rsp) throws IOException { String svc = req.getParameter("service"); - String accept = req.getHeader(HDR_ACCEPT); - if (svc != null && svc.startsWith("git-") && accept != null - && accept.contains("application/x-" + svc + "-advertisement")) { + if (req.getRequestURI().endsWith("/info/refs") && isService(svc)) { // Smart HTTP service request, use an ERR response. rsp.setContentType("application/x-" + svc + "-advertisement"); @@ -170,6 +168,7 @@ public class RepositoryFilter implements Filter { return; } + String accept = req.getHeader(HDR_ACCEPT); if (accept != null && accept.contains(UploadPackServlet.RSP_TYPE)) { // An upload-pack wants ACK or NAK, return ERR // and the client will print this instead. @@ -188,6 +187,10 @@ public class RepositoryFilter implements Filter { rsp.sendError(statusCode); } + private static boolean isService(String svc) { + return "git-upload-pack".equals(svc) || "git-receive-pack".equals(svc); + } + private static String translate(int statusCode) { switch (statusCode) { case SC_NOT_FOUND: