diff options
author | Roeland Jago Douma <roeland@famdouma.nl> | 2017-05-03 14:22:02 +0200 |
---|---|---|
committer | Roeland Jago Douma <roeland@famdouma.nl> | 2017-05-08 11:20:49 +0200 |
commit | dd430c2fd72e2d77d69ab93090b5fb6ea6ba76a6 (patch) | |
tree | 695d26ae62df603571a04636af4db4bcc4082662 /apps/dav/lib/CardDAV/ImageExportPlugin.php | |
parent | 303c0dd6a8d2f614841b4ebdacff9ced7120a9e3 (diff) | |
download | nextcloud-server-dd430c2fd72e2d77d69ab93090b5fb6ea6ba76a6.tar.gz nextcloud-server-dd430c2fd72e2d77d69ab93090b5fb6ea6ba76a6.zip |
Cache the carddav photo endpoint
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Diffstat (limited to 'apps/dav/lib/CardDAV/ImageExportPlugin.php')
-rw-r--r-- | apps/dav/lib/CardDAV/ImageExportPlugin.php | 57 |
1 files changed, 40 insertions, 17 deletions
diff --git a/apps/dav/lib/CardDAV/ImageExportPlugin.php b/apps/dav/lib/CardDAV/ImageExportPlugin.php index 3ad7983451b..24bf1ada9f7 100644 --- a/apps/dav/lib/CardDAV/ImageExportPlugin.php +++ b/apps/dav/lib/CardDAV/ImageExportPlugin.php @@ -22,6 +22,7 @@ namespace OCA\DAV\CardDAV; +use OCP\Files\NotFoundException; use OCP\ILogger; use Sabre\CardDAV\Card; use Sabre\DAV\Server; @@ -38,9 +39,18 @@ class ImageExportPlugin extends ServerPlugin { protected $server; /** @var ILogger */ private $logger; + /** @var PhotoCache */ + private $cache; - public function __construct(ILogger $logger) { + /** + * ImageExportPlugin constructor. + * + * @param ILogger $logger + * @param PhotoCache $cache + */ + public function __construct(ILogger $logger, PhotoCache $cache) { $this->logger = $logger; + $this->cache = $cache; } /** @@ -49,8 +59,7 @@ class ImageExportPlugin extends ServerPlugin { * @param Server $server * @return void */ - function initialize(Server $server) { - + public function initialize(Server $server) { $this->server = $server; $this->server->on('method:GET', [$this, 'httpGet'], 90); } @@ -60,9 +69,9 @@ class ImageExportPlugin extends ServerPlugin { * * @param RequestInterface $request * @param ResponseInterface $response - * @return bool|void + * @return bool */ - function httpGet(RequestInterface $request, ResponseInterface $response) { + public function httpGet(RequestInterface $request, ResponseInterface $response) { $queryParams = $request->getQueryParameters(); // TODO: in addition to photo we should also add logo some point in time @@ -70,6 +79,11 @@ class ImageExportPlugin extends ServerPlugin { return true; } + $size = -1; + if (isset($queryParams['size'])) { + $size = (int)$queryParams['size']; + } + $path = $request->getPath(); $node = $this->server->tree->getNodeForPath($path); @@ -85,22 +99,31 @@ class ImageExportPlugin extends ServerPlugin { $aclPlugin->checkPrivileges($path, '{DAV:}read'); } - if ($result = $this->getPhoto($node)) { - // Allow caching - $response->setHeader('Cache-Control', 'private, max-age=3600, must-revalidate'); - $response->setHeader('Etag', $node->getETag() ); - $response->setHeader('Pragma', 'public'); + // Fetch addressbook + $addressbookpath = explode('/', $path); + array_pop($addressbookpath); + $addressbookpath = implode('/', $addressbookpath); + /** @var AddressBook $addressbook */ + $addressbook = $this->server->tree->getNodeForPath($addressbookpath); - $response->setHeader('Content-Type', $result['Content-Type']); - $response->setHeader('Content-Disposition', 'attachment'); - $response->setStatus(200); + $hash = md5($addressbook->getResourceId() . $node->getName()); + + $response->setHeader('Cache-Control', 'private, max-age=3600, must-revalidate'); + $response->setHeader('Etag', $node->getETag() ); + $response->setHeader('Pragma', 'public'); - $response->setBody($result['body']); + try { + $file = $this->cache->get($hash, $size, $node); + $response->setHeader('Content-Type', $file->getMimeType()); + $response->setHeader('Content-Disposition', 'inline'); + $response->setStatus(200); - // Returning false to break the event chain - return false; + $response->setBody($file->getContent()); + } catch (NotFoundException $e) { + $response->setStatus(404); } - return true; + + return false; } function getPhoto(Card $node) { |