Signed-off-by: Robin Appelman <robin@icewind.nl>tags/v15.0.0RC1
@@ -50,6 +50,7 @@ use OCP\Files\ForbiddenException; | |||
use OCP\Files\InvalidContentException; | |||
use OCP\Files\InvalidPathException; | |||
use OCP\Files\LockNotAcquiredException; | |||
use OCP\Files\NotFoundException; | |||
use OCP\Files\NotPermittedException; | |||
use OCP\Files\Storage; | |||
use OCP\Files\StorageNotAvailableException; | |||
@@ -592,6 +593,9 @@ class File extends Node implements IFile { | |||
if ($e instanceof StorageNotAvailableException) { | |||
throw new ServiceUnavailable('Failed to write file contents: ' . $e->getMessage(), 0, $e); | |||
} | |||
if ($e instanceof NotFoundException) { | |||
throw new NotFound('File not found: ' . $e->getMessage(), 0, $e); | |||
} | |||
throw new \Sabre\DAV\Exception($e->getMessage(), 0, $e); | |||
} |
@@ -29,6 +29,7 @@ use Icewind\Streams\CallbackWrapper; | |||
use Icewind\Streams\IteratorDirectory; | |||
use OC\Files\Cache\CacheEntry; | |||
use OC\Files\Stream\CountReadStream; | |||
use OCP\Files\NotFoundException; | |||
use OCP\Files\ObjectStore\IObjectStore; | |||
class ObjectStoreStorage extends \OC\Files\Storage\Common { | |||
@@ -275,10 +276,16 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common { | |||
if (is_array($stat)) { | |||
try { | |||
return $this->objectStore->readObject($this->getURN($stat['fileid'])); | |||
} catch (NotFoundException $e) { | |||
$this->logger->logException($e, [ | |||
'app' => 'objectstore', | |||
'message' => 'Could not get object ' . $this->getURN($stat['fileid']) . ' for file ' . $path, | |||
]); | |||
throw $e; | |||
} catch (\Exception $ex) { | |||
$this->logger->logException($ex, [ | |||
'app' => 'objectstore', | |||
'message' => 'Count not get object ' . $this->getURN($stat['fileid']) . ' for file ' . $path, | |||
'message' => 'Could not get object ' . $this->getURN($stat['fileid']) . ' for file ' . $path, | |||
]); | |||
return false; | |||
} |
@@ -27,8 +27,10 @@ namespace OC\Files\ObjectStore; | |||
use function GuzzleHttp\Psr7\stream_for; | |||
use Icewind\Streams\RetryWrapper; | |||
use OCP\Files\NotFoundException; | |||
use OCP\Files\ObjectStore\IObjectStore; | |||
use OCP\Files\StorageAuthException; | |||
use OpenStack\Common\Error\BadResponseError; | |||
class Swift implements IObjectStore { | |||
/** | |||
@@ -86,11 +88,19 @@ class Swift implements IObjectStore { | |||
* @throws \Exception from openstack lib when something goes wrong | |||
*/ | |||
public function readObject($urn) { | |||
$object = $this->getContainer()->getObject($urn); | |||
// we need to keep a reference to objectContent or | |||
// the stream will be closed before we can do anything with it | |||
$objectContent = $object->download(); | |||
try { | |||
$object = $this->getContainer()->getObject($urn); | |||
// we need to keep a reference to objectContent or | |||
// the stream will be closed before we can do anything with it | |||
$objectContent = $object->download(); | |||
} catch (BadResponseError $e) { | |||
if ($e->getResponse()->getStatusCode() === 404) { | |||
throw new NotFoundException("object $urn not found in object store"); | |||
} else { | |||
throw $e; | |||
} | |||
} | |||
$objectContent->rewind(); | |||
$stream = $objectContent->detach(); |