You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2024/05/21 11:55:03 UTC
(tomcat) branch main updated: Add support for shallow copies when using WebDAV
This is an automated email from the ASF dual-hosted git repository.
markt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git
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 <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 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);
+ }
}
} else if (sourceResource.isFile()) {
WebResource destResource = resources.getResource(dest);
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 777667c181..aa3966382c 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 11.0.0-M21 (markt)" rtext="in development">
+ <subsection name="Catalina">
+ <changelog>
+ <add>
+ Add support for shallow copies when using WebDAV. (markt)
+ </add>
+ </changelog>
+ </subsection>
<subsection name="Coyote">
<changelog>
<fix>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org
Re: (tomcat) branch main updated: Add support for shallow copies when using WebDAV
Posted by Mark Thomas <ma...@apache.org>.
On 23/05/2024 12:53, Konstantin Kolinko wrote:
> вт, 21 мая 2024 г. в 14:55, <ma...@apache.org>:
>>
>> 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 <ma...@apache.org>
>> AuthorDate: Tue May 21 12:54:40 2024 +0100
>>
>> Add support for shallow copies when using WebDAV
<snip/>
>> @@ -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.
Thanks for the review. I've widened the block.
Thinking about it the infinite/not infinite copy option is fairly
pointless. For a file it has no impact. For a directory you either copy
the whole tree or just create a new directory - and MKCOL can be used
for that. Oh well.
Mark
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org
Re: (tomcat) branch main updated: Add support for shallow copies when using WebDAV
Posted by Konstantin Kolinko <kn...@gmail.com>.
вт, 21 мая 2024 г. в 14:55, <ma...@apache.org>:
>
> 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 <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 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: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org