From f43cfd9275d7f6d1be325c8630e19b0bf4e81b77 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Fri, 16 Nov 2018 20:21:21 +0100 Subject: [PATCH] forward object not found error in swift as dav 404 Signed-off-by: Robin Appelman --- apps/dav/lib/Connector/Sabre/File.php | 4 ++++ .../Files/ObjectStore/ObjectStoreStorage.php | 10 +++++++++- lib/private/Files/ObjectStore/Swift.php | 18 ++++++++++++++---- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/apps/dav/lib/Connector/Sabre/File.php b/apps/dav/lib/Connector/Sabre/File.php index 9e927ff85e..66400c9585 100644 --- a/apps/dav/lib/Connector/Sabre/File.php +++ b/apps/dav/lib/Connector/Sabre/File.php @@ -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; @@ -583,6 +584,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); } diff --git a/lib/private/Files/ObjectStore/ObjectStoreStorage.php b/lib/private/Files/ObjectStore/ObjectStoreStorage.php index 3ce919a4cb..d8649129d9 100644 --- a/lib/private/Files/ObjectStore/ObjectStoreStorage.php +++ b/lib/private/Files/ObjectStore/ObjectStoreStorage.php @@ -28,6 +28,8 @@ namespace OC\Files\ObjectStore; 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 { @@ -274,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; } diff --git a/lib/private/Files/ObjectStore/Swift.php b/lib/private/Files/ObjectStore/Swift.php index 6bb01506c4..667b92bd1d 100644 --- a/lib/private/Files/ObjectStore/Swift.php +++ b/lib/private/Files/ObjectStore/Swift.php @@ -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); + 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(); + // 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();