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
parent e860507201
commit 98ca765572
No known key found for this signature in database
GPG key ID: 42B69D8A64526EFB
3 changed files with 19 additions and 6 deletions

View file

@ -52,6 +52,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;
@ -618,10 +619,14 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
}
} else {
$source = $sourceStorage->fopen($sourceInternalPath, 'r');
$result = false;
if ($source) {
$result = $this->writeStream($targetInternalPath, $source) > 0;
} else {
$result = false;
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) {
@ -852,10 +857,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

@ -43,6 +43,7 @@ namespace OC\Files\Storage;
use OC\Files\Filesystem;
use OC\Files\Storage\Wrapper\Jail;
use OCP\Files\ForbiddenException;
use OCP\Files\GenericFileException;
use OCP\Files\Storage\IStorage;
use OCP\ILogger;
@ -500,6 +501,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\Files\Config\IMountProvider;
use OCP\Files\FileInfo;