remm 2003/11/14 02:16:22 Modified: catalina/src/share/org/apache/catalina/servlets WebdavServlet.java Log: - Allow header handling. - Bug 24006, submitted by Mark Thomas. Revision Changes Path 1.6 +64 -31 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/servlets/WebdavServlet.java Index: WebdavServlet.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/servlets/WebdavServlet.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- WebdavServlet.java 6 Oct 2003 08:05:46 -0000 1.5 +++ WebdavServlet.java 14 Nov 2003 10:16:22 -0000 1.6 @@ -338,11 +338,8 @@ protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - String path = getRelativePath(req); - resp.addHeader("DAV", "1,2"); - String methodsAllowed = null; - + // Retrieve the resources DirContext resources = getResources(); @@ -351,28 +348,10 @@ return; } - boolean exists = true; - Object object = null; - try { - object = resources.lookup(path); - } catch (NamingException e) { - exists = false; - } - - if (!exists) { - methodsAllowed = "OPTIONS, MKCOL, PUT, LOCK"; - resp.addHeader("Allow", methodsAllowed); - return; - } - - methodsAllowed = "OPTIONS, GET, HEAD, POST, DELETE, TRACE, " - + "PROPFIND, PROPPATCH, COPY, MOVE, LOCK, UNLOCK"; - if (!(object instanceof DirContext)) { - methodsAllowed += ", PUT"; - } - - resp.addHeader("Allow", methodsAllowed); + StringBuffer methodsAllowed = determineMethodsAllowed(resources, + req); + resp.addHeader("Allow", methodsAllowed.toString()); resp.addHeader("MS-Author-Via", "DAV"); } @@ -385,6 +364,19 @@ throws ServletException, IOException { if (!listings) { + // Retrieve the resources + DirContext resources = getResources(); + + if (resources == null) { + resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + return; + } + + // Get allowed methods + StringBuffer methodsAllowed = determineMethodsAllowed(resources, + req); + + resp.addHeader("Allow", methodsAllowed.toString()); resp.sendError(WebdavStatus.SC_METHOD_NOT_ALLOWED); return; } @@ -649,7 +641,7 @@ return; } - resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED); + resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); } @@ -697,6 +689,12 @@ // Can't create a collection if a resource already exists at the given // path if (exists) { + // Get allowed methods + StringBuffer methodsAllowed = determineMethodsAllowed(resources, + req); + + resp.addHeader("Allow", methodsAllowed.toString()); + resp.sendError(WebdavStatus.SC_METHOD_NOT_ALLOWED); return; } @@ -2566,6 +2564,42 @@ return creationDateValue.toString(); } + /** + * Determines the methods normally allowed for the resource. + * + */ + private StringBuffer determineMethodsAllowed(DirContext resources, + HttpServletRequest req) { + + StringBuffer methodsAllowed = new StringBuffer(); + boolean exists = true; + Object object = null; + try { + String path = getRelativePath(req); + + object = resources.lookup(path); + } catch (NamingException e) { + exists = false; + } + + if (!exists) { + methodsAllowed.append("OPTIONS, MKCOL, PUT, LOCK"); + return methodsAllowed; + } + + methodsAllowed.append("OPTIONS, GET, HEAD, POST, DELETE, TRACE, "); + methodsAllowed.append("PROPPATCH, COPY, MOVE, LOCK, UNLOCK"); + + if (listings) { + methodsAllowed.append("PROPFIND, "); + } + + if (!(object instanceof DirContext)) { + methodsAllowed.append(", PUT"); + } + + return methodsAllowed; + } // -------------------------------------------------- LockInfo Inner Class @@ -3041,7 +3075,6 @@ private static void addStatusCodeMap(int nKey, String strVal) { mapStatusCodes.put(new Integer(nKey), strVal); } - };
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]