]> source.dussan.org Git - jgit.git/commitdiff
Fix error handling in RepositoryFilter 35/3335/1
authorShawn O. Pearce <spearce@spearce.org>
Wed, 4 May 2011 21:55:53 +0000 (14:55 -0700)
committerShawn O. Pearce <spearce@spearce.org>
Wed, 4 May 2011 21:58:33 +0000 (14:58 -0700)
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 <spearce@spearce.org>
org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/RepositoryFilter.java

index 3e0a572564831a354f003277849f185bc9f8c21d..1462593858dab47f130e57349eb3b0ec60fca979 100644 (file)
@@ -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: