summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoeland Jago Douma <roeland@famdouma.nl>2018-05-29 11:10:07 +0200
committerRoeland Jago Douma <roeland@famdouma.nl>2018-06-04 08:48:54 +0200
commita34495933e83c4c850308e3448a16160162eb65a (patch)
treef0996c9fe47219b744a79890506e97238b2a36c1
parent36d74047f7ead966438ae7958ca7d7f816860515 (diff)
downloadnextcloud-server-a34495933e83c4c850308e3448a16160162eb65a.tar.gz
nextcloud-server-a34495933e83c4c850308e3448a16160162eb65a.zip
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 <roeland@famdouma.nl>
-rw-r--r--lib/public/AppFramework/Http/Response.php16
-rw-r--r--tests/lib/AppFramework/Http/ResponseTest.php14
2 files changed, 26 insertions, 4 deletions
diff --git a/lib/public/AppFramework/Http/Response.php b/lib/public/AppFramework/Http/Response.php
index 512b312dae1..a6f5afd3c18 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 9267d862600..5c867388369 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']);
}