Skip to content

Commit

Permalink
Merge pull request #12500 from nextcloud/swift-object-not-found
Browse files Browse the repository at this point in the history
forward object not found error in swift as dav 404
  • Loading branch information
MorrisJobke authored Nov 20, 2018
2 parents 2be8930 + cef8ead commit 8e65f08
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 6 deletions.
4 changes: 4 additions & 0 deletions apps/dav/lib/Connector/Sabre/File.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
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;
Expand Down Expand Up @@ -592,6 +593,9 @@ private function convertToSabreException(\Exception $e) {
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);
}
Expand Down
9 changes: 8 additions & 1 deletion lib/private/Files/ObjectStore/ObjectStoreStorage.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
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 {
Expand Down Expand Up @@ -275,10 +276,16 @@ public function fopen($path, $mode) {
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;
}
Expand Down
21 changes: 16 additions & 5 deletions lib/private/Files/ObjectStore/Swift.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,10 @@

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 {
/**
Expand Down Expand Up @@ -84,13 +86,22 @@ public function writeObject($urn, $stream) {
* @param string $urn the unified resource name used to identify the object
* @return resource stream with the read data
* @throws \Exception from openstack lib when something goes wrong
* @throws NotFoundException if file does not exist
*/
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();
Expand Down
3 changes: 3 additions & 0 deletions lib/public/Files/ObjectStore/IObjectStore.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
*/
namespace OCP\Files\ObjectStore;

use OCP\Files\NotFoundException;

/**
* Interface IObjectStore
*
Expand All @@ -41,6 +43,7 @@ public function getStorageId();
* @param string $urn the unified resource name used to identify the object
* @return resource stream with the read data
* @throws \Exception when something goes wrong, message will be logged
* @throws NotFoundException if file does not exist
* @since 7.0.0
*/
public function readObject($urn);
Expand Down

0 comments on commit 8e65f08

Please sign in to comment.