From 59e27f03b641e6048416b4ff252a66adc88100f7 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Tue, 2 May 2017 12:30:34 +0200 Subject: [PATCH 1/2] Add caching to the imageexport plugin Since we now heavily use this endpoint for the contacts menu we better set proper caching on the images. Else this gets reload over and over again leading to slow loading menu and unneded bytes transfered. * cache for 1 hour by default * added ETag for validation Signed-off-by: Roeland Jago Douma --- apps/dav/lib/CardDAV/ImageExportPlugin.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/dav/lib/CardDAV/ImageExportPlugin.php b/apps/dav/lib/CardDAV/ImageExportPlugin.php index e48410d26d6..3ad7983451b 100644 --- a/apps/dav/lib/CardDAV/ImageExportPlugin.php +++ b/apps/dav/lib/CardDAV/ImageExportPlugin.php @@ -86,6 +86,11 @@ class ImageExportPlugin extends ServerPlugin { } 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'); + $response->setHeader('Content-Type', $result['Content-Type']); $response->setHeader('Content-Disposition', 'attachment'); $response->setStatus(200); From d25e13ea27d950aa2815bfcb7bb9bd7d81249505 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Tue, 2 May 2017 12:35:42 +0200 Subject: [PATCH 2/2] Fix tests Signed-off-by: Roeland Jago Douma --- .../tests/unit/CardDAV/ImageExportPluginTest.php | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php b/apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php index fc4be1433fe..ed311e79f4a 100644 --- a/apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php +++ b/apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php @@ -102,6 +102,8 @@ class ImageExportPluginTest extends TestCase { $this->request->expects($this->once())->method('getPath')->willReturn('/files/welcome.txt'); $card = $this->getMockBuilder('Sabre\CardDAV\Card')->disableOriginalConstructor()->getMock(); + $card->method('getETag') + ->willReturn('"myEtag"'); $this->tree->expects($this->once())->method('getNodeForPath')->with('/files/welcome.txt')->willReturn($card); $this->plugin->expects($this->once())->method('getPhoto')->willReturn($getPhotoResult); @@ -110,10 +112,22 @@ class ImageExportPluginTest extends TestCase { $this->response ->expects($this->at(0)) ->method('setHeader') - ->with('Content-Type', $getPhotoResult['Content-Type']); + ->with('Cache-Control', 'private, max-age=3600, must-revalidate'); $this->response ->expects($this->at(1)) ->method('setHeader') + ->with('Etag', '"myEtag"'); + $this->response + ->expects($this->at(2)) + ->method('setHeader') + ->with('Pragma', 'public'); + $this->response + ->expects($this->at(3)) + ->method('setHeader') + ->with('Content-Type', $getPhotoResult['Content-Type']); + $this->response + ->expects($this->at(4)) + ->method('setHeader') ->with('Content-Disposition', 'attachment'); $this->response ->expects($this->once())