use exceptions for error signaling in writeStream

this remove the ambiguity when writing zero length files

Signed-off-by: Robin Appelman <robin@icewind.nl>
This commit is contained in:
Robin Appelman 2020-07-01 15:37:47 +02:00 committed by backportbot[bot]
parent b6a600e653
commit 7ac4d57fd5
3 changed files with 19 additions and 6 deletions

View File

@ -53,6 +53,7 @@ use OC\Files\Storage\Wrapper\Jail;
use OC\Files\Storage\Wrapper\Wrapper;
use OCP\Files\EmptyFileNameException;
use OCP\Files\FileNameTooLongException;
use OCP\Files\GenericFileException;
use OCP\Files\InvalidCharacterInPathException;
use OCP\Files\InvalidDirectoryException;
use OCP\Files\InvalidPathException;
@ -620,10 +621,14 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
}
} else {
$source = $sourceStorage->fopen($sourceInternalPath, 'r');
if ($source) {
$result = $this->writeStream($targetInternalPath, $source) > 0;
} else {
$result = false;
if ($source) {
try {
$this->writeStream($targetInternalPath, $source);
$result = true;
} catch (\Exception $e) {
\OC::$server->getLogger()->logException($e, ['level' => ILogger::WARN, 'message' => 'Failed to copy stream to storage']);
}
}
if ($result and $preserveMtime) {
@ -855,10 +860,13 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
public function writeStream(string $path, $stream, int $size = null): int {
$target = $this->fopen($path, 'w');
if (!$target) {
return 0;
throw new GenericFileException("Failed to open $path for writing");
}
try {
[$count, $result] = \OC_Helper::streamCopy($stream, $target);
if (!$result) {
throw new GenericFileException("Failed to copy stream");
}
} finally {
fclose($target);
fclose($stream);

View File

@ -44,6 +44,7 @@ use OC\Files\Filesystem;
use OC\Files\Storage\Wrapper\Jail;
use OCP\Constants;
use OCP\Files\ForbiddenException;
use OCP\Files\GenericFileException;
use OCP\Files\Storage\IStorage;
use OCP\ILogger;
@ -553,6 +554,11 @@ class Local extends \OC\Files\Storage\Common {
}
public function writeStream(string $path, $stream, int $size = null): int {
return (int)file_put_contents($this->getSourcePath($path), $stream);
$result = file_put_contents($this->getSourcePath($path), $stream);
if ($result === false) {
throw new GenericFileException("Failed write steam to $path");
} else {
return $result;
}
}
}

View File

@ -13,7 +13,6 @@ use OC\Files\Filesystem;
use OC\Files\Mount\MountPoint;
use OC\Files\Storage\Common;
use OC\Files\Storage\Temporary;
use OC\Files\Stream\Quota;
use OC\Files\View;
use OCP\Constants;
use OCP\Files\Config\IMountProvider;