From 6f346b4b1f4512668e631ac57e71fac9061bc5fe Mon Sep 17 00:00:00 2001
From: Vincent Petry <pvince81@owncloud.com>
Date: Fri, 3 Jul 2015 19:49:25 +0200
Subject: [PATCH] Fix webdav destination header when overwriting folders

The trailing slash is needed when talking to Apache's mod_dav server
---
 lib/private/Files/Storage/DAV.php | 29 +++++++++++++++++++++++------
 1 file changed, 23 insertions(+), 6 deletions(-)

diff --git a/lib/private/Files/Storage/DAV.php b/lib/private/Files/Storage/DAV.php
index 04910ece684..4713eb86fc0 100644
--- a/lib/private/Files/Storage/DAV.php
+++ b/lib/private/Files/Storage/DAV.php
@@ -506,13 +506,18 @@ class DAV extends Common {
 		$path1 = $this->cleanPath($path1);
 		$path2 = $this->cleanPath($path2);
 		try {
+			// overwrite directory ?
+			if ($this->is_dir($path2)) {
+				// needs trailing slash in destination
+				$path2 = rtrim($path2, '/') . '/';
+			}
 			$this->client->request(
 				'MOVE',
 				$this->encodePath($path1),
 				null,
-				array(
-					'Destination' => $this->createBaseUri() . $this->encodePath($path2)
-				)
+				[
+					'Destination' => $this->createBaseUri() . $this->encodePath($path2),
+				]
 			);
 			$this->statCache->clear($path1 . '/');
 			$this->statCache->clear($path2 . '/');
@@ -530,10 +535,22 @@ class DAV extends Common {
 	/** {@inheritdoc} */
 	public function copy($path1, $path2) {
 		$this->init();
-		$path1 = $this->encodePath($this->cleanPath($path1));
-		$path2 = $this->createBaseUri() . $this->encodePath($this->cleanPath($path2));
+		$path1 = $this->cleanPath($path1);
+		$path2 = $this->cleanPath($path2);
 		try {
-			$this->client->request('COPY', $path1, null, array('Destination' => $path2));
+			// overwrite directory ?
+			if ($this->is_dir($path2)) {
+				// needs trailing slash in destination
+				$path2 = rtrim($path2, '/') . '/';
+			}
+			$this->client->request(
+				'COPY',
+				$this->encodePath($path1),
+				null,
+				[
+					'Destination' => $this->createBaseUri() . $this->encodePath($path2),
+				]
+			);
 			$this->statCache->clear($path2 . '/');
 			$this->statCache->set($path2, true);
 			$this->removeCachedFile($path2);
-- 
GitLab