From a34495933e83c4c850308e3448a16160162eb65a Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Tue, 29 May 2018 11:10:07 +0200 Subject: [PATCH] Move caching logic to response This avoids having to do it at all the places we want cached responses. We can't inject the ITimeFactor without breaking public API. However we can perfectly overwrite the service (resulting in the same testable effect). Signed-off-by: Roeland Jago Douma --- lib/public/AppFramework/Http/Response.php | 16 ++++++++++++++-- tests/lib/AppFramework/Http/ResponseTest.php | 14 ++++++++++++-- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/lib/public/AppFramework/Http/Response.php b/lib/public/AppFramework/Http/Response.php index 512b312dae..a6f5afd3c1 100644 --- a/lib/public/AppFramework/Http/Response.php +++ b/lib/public/AppFramework/Http/Response.php @@ -35,6 +35,7 @@ namespace OCP\AppFramework\Http; use OCP\AppFramework\Http; +use OCP\AppFramework\Utility\ITimeFactory; /** * Base class for responses. Also used to just send headers. @@ -95,12 +96,23 @@ class Response { * @return $this * @since 6.0.0 - return value was added in 7.0.0 */ - public function cacheFor($cacheSeconds) { - + public function cacheFor(int $cacheSeconds) { if($cacheSeconds > 0) { $this->addHeader('Cache-Control', 'max-age=' . $cacheSeconds . ', must-revalidate'); + + // Old scool prama caching + $this->addHeader('Pragma', 'public'); + + // Set expires header + $expires = new \DateTime(); + /** @var ITimeFactory $time */ + $time = \OC::$server->query(ITimeFactory::class); + $expires->setTimestamp($time->getTime()); + $expires->add(new \DateInterval('PT'.$cacheSeconds.'S')); + $this->addHeader('Expires', $expires->format(\DateTime::RFC2822)); } else { $this->addHeader('Cache-Control', 'no-cache, no-store, must-revalidate'); + unset($this->headers['Expires'], $this->headers['Pragma']); } return $this; diff --git a/tests/lib/AppFramework/Http/ResponseTest.php b/tests/lib/AppFramework/Http/ResponseTest.php index 9267d86260..5c86738836 100644 --- a/tests/lib/AppFramework/Http/ResponseTest.php +++ b/tests/lib/AppFramework/Http/ResponseTest.php @@ -27,6 +27,7 @@ namespace Test\AppFramework\Http; use OCP\AppFramework\Http\Response; use OCP\AppFramework\Http; +use OCP\AppFramework\Utility\ITimeFactory; class ResponseTest extends \Test\TestCase { @@ -222,15 +223,24 @@ class ResponseTest extends \Test\TestCase { $headers = $this->childResponse->getHeaders(); $this->assertEquals('no-cache, no-store, must-revalidate', $headers['Cache-Control']); + $this->assertFalse(isset($headers['Pragma'])); + $this->assertFalse(isset($headers['Expires'])); } public function testCacheSeconds() { + $time = $this->createMock(ITimeFactory::class); + $time->method('getTime') + ->willReturn('1234567'); + + $this->overwriteService(ITimeFactory::class, $time); + $this->childResponse->cacheFor(33); $headers = $this->childResponse->getHeaders(); - $this->assertEquals('max-age=33, must-revalidate', - $headers['Cache-Control']); + $this->assertEquals('max-age=33, must-revalidate', $headers['Cache-Control']); + $this->assertEquals('public', $headers['Pragma']); + $this->assertEquals('Thu, 15 Jan 1970 06:56:40 +0000', $headers['Expires']); }