вт, 21 мая 2024 г. в 14:55, <[email protected]>:
>
> The following commit(s) were added to refs/heads/main by this push:
> new 4176706761 Add support for shallow copies when using WebDAV
> 4176706761 is described below
>
> commit 4176706761242851b14be303daf2a00ef385ee49
> Author: Mark Thomas <[email protected]>
> 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 a489eb0e51..b1b67030af 100644
> --- a/java/org/apache/catalina/servlets/WebdavServlet.java
> +++ b/java/org/apache/catalina/servlets/WebdavServlet.java
> @@ -1519,7 +1519,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) {
> @@ -1548,16 +1561,18 @@ public class WebdavServlet extends DefaultServlet
> implements PeriodicEventListen
> /**
> * Copy a collection.
> *
> - * @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 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);
> @@ -1583,7 +1598,9 @@ public class WebdavServlet extends DefaultServlet
> implements PeriodicEventListen
> childSrc += "/";
> }
> childSrc += entry;
> - copyResource(errorList, childSrc, childDest);
> + if (infiniteCopy) {
> + copyResource(errorList, childSrc, childDest, true);
> + }
> }
I think that the "if (infiniteCopy)" block here is too narrow.
The whole loop over children (starting with "String[] entries =
resources.list(source)") here is useless when the infiniteCopy option
is false.
> } else if (sourceResource.isFile()) {
> WebResource destResource = resources.getResource(dest);
> diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]