From: Roeland Jago Douma Date: Mon, 7 Sep 2020 18:53:56 +0000 (+0200) Subject: Fix reading empty files from objectstorage X-Git-Tag: v20.0.0beta4~24^2 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=refs%2Fpull%2F22651%2Fhead;p=nextcloud-server.git Fix reading empty files from objectstorage Since we try to do range requests this will fail hard. However since empty files are not that interesting to read anyways we just read from an emptry memory stream. Signed-off-by: Roeland Jago Douma --- diff --git a/apps/files_external/lib/Lib/Storage/AmazonS3.php b/apps/files_external/lib/Lib/Storage/AmazonS3.php index 56376661343..0b364204304 100644 --- a/apps/files_external/lib/Lib/Storage/AmazonS3.php +++ b/apps/files_external/lib/Lib/Storage/AmazonS3.php @@ -405,12 +405,12 @@ class AmazonS3 extends \OC\Files\Storage\Common { */ private function getContentLength($path) { if (isset($this->filesCache[$path])) { - return $this->filesCache[$path]['ContentLength']; + return (int)$this->filesCache[$path]['ContentLength']; } $result = $this->headObject($path); if (isset($result['ContentLength'])) { - return $result['ContentLength']; + return (int)$result['ContentLength']; } return 0; @@ -507,6 +507,12 @@ class AmazonS3 extends \OC\Files\Storage\Common { switch ($mode) { case 'r': case 'rb': + // Don't try to fetch empty files + $stat = $this->stat($path); + if (is_array($stat) && isset($stat['size']) && $stat['size'] === 0) { + return fopen('php://memory', $mode); + } + try { return $this->readObject($path); } catch (S3Exception $e) { diff --git a/lib/private/Files/ObjectStore/ObjectStoreStorage.php b/lib/private/Files/ObjectStore/ObjectStoreStorage.php index 950840301b0..e675064eb1f 100644 --- a/lib/private/Files/ObjectStore/ObjectStoreStorage.php +++ b/lib/private/Files/ObjectStore/ObjectStoreStorage.php @@ -296,6 +296,11 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common { case 'rb': $stat = $this->stat($path); if (is_array($stat)) { + // Reading 0 sized files is a waste of time + if (isset($stat['size']) && $stat['size'] === 0) { + return fopen('php://memory', $mode); + } + try { return $this->objectStore->readObject($this->getURN($stat['fileid'])); } catch (NotFoundException $e) {