This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch 9.0.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit 5ba3e76797babe431f16878825e2a6a192e18863 Author: Mark Thomas <ma...@apache.org> AuthorDate: Tue May 21 12:54:40 2024 +0100 Add support for shallow copies when using WebDAV --- .../apache/catalina/servlets/WebdavServlet.java | 31 +++++++++++++++++----- webapps/docs/changelog.xml | 7 +++++ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/java/org/apache/catalina/servlets/WebdavServlet.java b/java/org/apache/catalina/servlets/WebdavServlet.java index fe26facb05..c5a4111f51 100644 --- a/java/org/apache/catalina/servlets/WebdavServlet.java +++ b/java/org/apache/catalina/servlets/WebdavServlet.java @@ -1518,7 +1518,20 @@ public class WebdavServlet extends DefaultServlet implements PeriodicEventListen Map<String,Integer> errorList = new HashMap<>(); - boolean result = copyResource(errorList, path, destinationPath); + boolean infiniteCopy = true; + String depthHeader = req.getHeader("Depth"); + if (depthHeader != null) { + if (depthHeader.equals("infinity")) { + // NO-OP - this is the default + } else if (depthHeader.equals("0")) { + infiniteCopy = false; + } else { + resp.sendError(WebdavStatus.SC_BAD_REQUEST); + return false; + } + } + + boolean result = copyResource(errorList, path, destinationPath, infiniteCopy); if ((!result) || (!errorList.isEmpty())) { if (errorList.size() == 1) { @@ -1547,16 +1560,18 @@ public class WebdavServlet extends DefaultServlet implements PeriodicEventListen /** * Copy a collection. * - * @param errorList Hashtable containing the list of errors which occurred during the copy operation - * @param source Path of the resource to be copied - * @param dest Destination path + * @param errorList Map containing the list of errors which occurred during the copy operation + * @param source Path of the resource to be copied + * @param dest Destination path + * @param infiniteCopy {@code true} if this copy is to be an infinite copy, otherwise {@code false} for a shallow + * copy * * @return <code>true</code> if the copy was successful */ - private boolean copyResource(Map<String,Integer> errorList, String source, String dest) { + private boolean copyResource(Map<String,Integer> errorList, String source, String dest, boolean infiniteCopy) { if (debug > 1) { - log("Copy: " + source + " To: " + dest); + log("Copy: " + source + " To: " + dest + " Infinite: " + infiniteCopy); } WebResource sourceResource = resources.getResource(source); @@ -1582,7 +1597,9 @@ public class WebdavServlet extends DefaultServlet implements PeriodicEventListen childSrc += "/"; } childSrc += entry; - copyResource(errorList, childSrc, childDest); + if (infiniteCopy) { + copyResource(errorList, childSrc, childDest, true); + } } } else if (sourceResource.isFile()) { WebResource destResource = resources.getResource(dest); diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 956a1af8fc..541b3a9613 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -105,6 +105,13 @@ issues do not "pop up" wrt. others). --> <section name="Tomcat 9.0.90 (remm)" rtext="in development"> + <subsection name="Catalina"> + <changelog> + <add> + Add support for shallow copies when using WebDAV. (markt) + </add> + </changelog> + </subsection> <subsection name="Other"> <changelog> <update> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org