From 3499cbdb76d264353d3d9f358601694bc4aae956 Mon Sep 17 00:00:00 2001
From: Robin Appelman <robin@icewind.nl>
Date: Wed, 24 Jan 2018 17:22:05 +0100
Subject: Use S3Client::upload instead of splitting single/multipart upload
 ourselves

Signed-off-by: Robin Appelman <robin@icewind.nl>
---
 lib/private/Files/ObjectStore/S3ObjectTrait.php | 45 ++-----------------------
 tests/lib/Files/ObjectStore/S3Test.php          | 17 +++++++---
 2 files changed, 14 insertions(+), 48 deletions(-)

diff --git a/lib/private/Files/ObjectStore/S3ObjectTrait.php b/lib/private/Files/ObjectStore/S3ObjectTrait.php
index 9c5cf9ccc6c..defeda4c21a 100644
--- a/lib/private/Files/ObjectStore/S3ObjectTrait.php
+++ b/lib/private/Files/ObjectStore/S3ObjectTrait.php
@@ -75,51 +75,10 @@ trait S3ObjectTrait {
 	 * @since 7.0.0
 	 */
 	function writeObject($urn, $stream) {
-		$stat = fstat($stream);
-
-		if ($stat['size'] && $stat['size'] < S3_UPLOAD_PART_SIZE) {
-			$this->singlePartUpload($urn, $stream);
-		} else {
-			$this->multiPartUpload($urn, $stream);
-		}
-
-	}
-
-	protected function singlePartUpload($urn, $stream) {
-		$this->getConnection()->putObject([
-			'Bucket' => $this->bucket,
-			'Key' => $urn,
-			'Body' => $stream
-		]);
-	}
-
-	protected function multiPartUpload($urn, $stream) {
-		$uploader = new MultipartUploader($this->getConnection(), $stream, [
-			'bucket' => $this->bucket,
-			'key' => $urn,
+		$this->getConnection()->upload($this->bucket, $urn, $stream, 'private', [
+			'mup_threshold' => S3_UPLOAD_PART_SIZE,
 			'part_size' => S3_UPLOAD_PART_SIZE
 		]);
-
-		$tries = 0;
-
-		do {
-			try {
-				$result = $uploader->upload();
-			} catch (MultipartUploadException $e) {
-				\OC::$server->getLogger()->logException($e);
-				rewind($stream);
-				$tries++;
-
-				if ($tries < 5) {
-					$uploader = new MultipartUploader($this->getConnection(), $stream, [
-						'state' => $e->getState()
-					]);
-				} else {
-					$this->getConnection()->abortMultipartUpload($e->getState()->getId());
-					throw $e;
-				}
-			}
-		} while (!isset($result) && $tries < 5);
 	}
 
 	/**
diff --git a/tests/lib/Files/ObjectStore/S3Test.php b/tests/lib/Files/ObjectStore/S3Test.php
index 14167656fb5..a54ade8fd08 100644
--- a/tests/lib/Files/ObjectStore/S3Test.php
+++ b/tests/lib/Files/ObjectStore/S3Test.php
@@ -24,8 +24,10 @@ namespace Test\Files\ObjectStore;
 use OC\Files\ObjectStore\S3;
 
 class MultiPartUploadS3 extends S3 {
-	public function multiPartUpload($urn, $stream) {
-		parent::multiPartUpload($urn, $stream);
+	function writeObject($urn, $stream) {
+		$this->getConnection()->upload($this->bucket, $urn, $stream, 'private', [
+			'mup_threshold' => 1
+		]);
 	}
 }
 
@@ -39,13 +41,18 @@ class S3Test extends ObjectStoreTest {
 			$this->markTestSkipped('objectstore not configured for s3');
 		}
 
-		return new MultiPartUploadS3($config['arguments']);
+		return new S3($config['arguments']);
 	}
 
 	public function testMultiPartUploader() {
-		$s3 = $this->getInstance();
+		$config = \OC::$server->getConfig()->getSystemValue('objectstore');
+		if (!is_array($config) || $config['class'] !== 'OC\\Files\\ObjectStore\\S3') {
+			$this->markTestSkipped('objectstore not configured for s3');
+		}
+
+		$s3 = new MultiPartUploadS3($config['arguments']);
 
-		$s3->multiPartUpload('multiparttest', fopen(__FILE__, 'r'));
+		$s3->writeObject('multiparttest', fopen(__FILE__, 'r'));
 
 		$result = $s3->readObject('multiparttest');
 
-- 
cgit v1.2.3