diff --git a/app/code/Magento/MediaStorage/Model/File/Storage/Response.php b/app/code/Magento/MediaStorage/Model/File/Storage/Response.php index ba0f47afacaac18635c4c03a34e8af61c758321a..bedbef698965cde0c29b5778ee6904e319bf7f72 100644 --- a/app/code/Magento/MediaStorage/Model/File/Storage/Response.php +++ b/app/code/Magento/MediaStorage/Model/File/Storage/Response.php @@ -29,15 +29,17 @@ class Response extends Http implements \Magento\Framework\App\Response\FileInter * @param CookieManagerInterface $cookieManager * @param CookieMetadataFactory $cookieMetadataFactory * @param \Magento\Framework\App\Http\Context $context + * @param \Magento\Framework\Stdlib\DateTime $dateTime * @param \Magento\Framework\File\Transfer\Adapter\Http $transferAdapter */ public function __construct( CookieManagerInterface $cookieManager, CookieMetadataFactory $cookieMetadataFactory, \Magento\Framework\App\Http\Context $context, + \Magento\Framework\Stdlib\DateTime $dateTime, \Magento\Framework\File\Transfer\Adapter\Http $transferAdapter ) { - parent::__construct($cookieManager, $cookieMetadataFactory, $context); + parent::__construct($cookieManager, $cookieMetadataFactory, $context, $dateTime); $this->_transferAdapter = $transferAdapter; } diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/TestCase/ControllerAbstractTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/TestCase/ControllerAbstractTest.php index f8d7b83b9dd7c3bdc59136438d847546a43d5c05..edd2d4e255b92fb7ff4c1fb1ccd4ec40fdb63dd2 100644 --- a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/TestCase/ControllerAbstractTest.php +++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/TestCase/ControllerAbstractTest.php @@ -17,19 +17,11 @@ class ControllerAbstractTest extends \Magento\TestFramework\TestCase\AbstractCon protected function setUp() { - $this->messageManager = $this->getMock('\Magento\Framework\Message\Manager', [], [], '', false); - $request = new \Magento\TestFramework\Request( - $this->getMock('Magento\Framework\Stdlib\Cookie\CookieReaderInterface'), - $this->getMock('Magento\Framework\App\Route\ConfigInterface\Proxy', [], [], '', false), - $this->getMock('Magento\Framework\App\Request\PathInfoProcessorInterface'), - $this->getMock('Magento\Framework\ObjectManagerInterface') - ); - $response = new \Magento\TestFramework\Response( - $this->getMock('Magento\Framework\Stdlib\CookieManagerInterface'), - $this->getMock('Magento\Framework\Stdlib\Cookie\CookieMetadataFactory', [], [], '', false), - $this->getMock('Magento\Framework\App\Http\Context', [], [], '', false) - ); + $testObjectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->messageManager = $this->getMock('\Magento\Framework\Message\Manager', [], [], '', false); + $request = $testObjectManager->getObject('Magento\TestFramework\Request'); + $response = $testObjectManager->getObject('Magento\TestFramework\Response'); $this->_objectManager = $this->getMock( 'Magento\TestFramework\ObjectManager', ['get', 'create'], diff --git a/lib/internal/Magento/Framework/App/Response/Http.php b/lib/internal/Magento/Framework/App/Response/Http.php index 63da363b6dacb2fb0632d4b3f082f23981a35a4f..6b510679daadc5b371fcf9c67f36ddfa7487ea1f 100644 --- a/lib/internal/Magento/Framework/App/Response/Http.php +++ b/lib/internal/Magento/Framework/App/Response/Http.php @@ -11,42 +11,44 @@ use Magento\Framework\App\Http\Context; use Magento\Framework\App\ObjectManager; use Magento\Framework\Stdlib\Cookie\CookieMetadataFactory; use Magento\Framework\Stdlib\CookieManagerInterface; +use Magento\Framework\Stdlib\DateTime; class Http extends \Magento\Framework\HTTP\PhpEnvironment\Response { - /** - * Cookie to store page vary string - */ + /** Cookie to store page vary string */ const COOKIE_VARY_STRING = 'X-Magento-Vary'; - /** - * @var \Magento\Framework\Stdlib\CookieManagerInterface - */ + /** Format for expiration timestamp headers */ + const EXPIRATION_TIMESTAMP_FORMAT = 'D, d M Y H:i:s T'; + + /** @var \Magento\Framework\Stdlib\CookieManagerInterface */ protected $cookieManager; - /** - * @var \Magento\Framework\Stdlib\Cookie\CookieMetadataFactory - */ + /** @var \Magento\Framework\Stdlib\Cookie\CookieMetadataFactory */ protected $cookieMetadataFactory; - /** - * @var \Magento\Framework\App\Http\Context - */ + /** @var \Magento\Framework\App\Http\Context */ protected $context; + /** @var DateTime */ + protected $dateTime; + /** * @param CookieManagerInterface $cookieManager * @param CookieMetadataFactory $cookieMetadataFactory * @param Context $context + * @param DateTime $dateTime */ public function __construct( CookieManagerInterface $cookieManager, CookieMetadataFactory $cookieMetadataFactory, - Context $context + Context $context, + DateTime $dateTime ) { $this->cookieManager = $cookieManager; $this->cookieMetadataFactory = $cookieMetadataFactory; $this->context = $context; + $this->dateTime = $dateTime; } /** @@ -97,7 +99,7 @@ class Http extends \Magento\Framework\HTTP\PhpEnvironment\Response } $this->setHeader('pragma', 'cache', true); $this->setHeader('cache-control', 'public, max-age=' . $ttl . ', s-maxage=' . $ttl, true); - $this->setHeader('expires', gmdate('D, d M Y H:i:s T', strtotime('+' . $ttl . ' seconds')), true); + $this->setHeader('expires', $this->getExpirationHeader('+' . $ttl . ' seconds'), true); } /** @@ -114,7 +116,7 @@ class Http extends \Magento\Framework\HTTP\PhpEnvironment\Response } $this->setHeader('pragma', 'cache', true); $this->setHeader('cache-control', 'private, max-age=' . $ttl, true); - $this->setHeader('expires', gmdate('D, d M Y H:i:s T', strtotime('+' . $ttl . ' seconds')), true); + $this->setHeader('expires', $this->getExpirationHeader('+' . $ttl . ' seconds'), true); } /** @@ -126,7 +128,7 @@ class Http extends \Magento\Framework\HTTP\PhpEnvironment\Response { $this->setHeader('pragma', 'no-cache', true); $this->setHeader('cache-control', 'no-store, no-cache, must-revalidate, max-age=0', true); - $this->setHeader('expires', gmdate('D, d M Y H:i:s T', strtotime('-1 year')), true); + $this->setHeader('expires', $this->getExpirationHeader('-1 year'), true); } /** @@ -160,4 +162,15 @@ class Http extends \Magento\Framework\HTTP\PhpEnvironment\Response $this->cookieManager = $objectManager->create('Magento\Framework\Stdlib\CookieManagerInterface'); $this->cookieMetadataFactory = $objectManager->get('Magento\Framework\Stdlib\Cookie\CookieMetadataFactory'); } + + /** + * Given a time input, returns the formatted header + * + * @param string $time + * @return string + */ + protected function getExpirationHeader($time) + { + return $this->dateTime->gmDate(self::EXPIRATION_TIMESTAMP_FORMAT, $this->dateTime->strToTime($time)); + } } diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Response/HttpTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Response/HttpTest.php index 182e7cfe65fab07449a7794cd68e766f28a4dec1..3fb38007f0a56a0152d2caabd4e0f3109551e0dd 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/Response/HttpTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/Response/HttpTest.php @@ -13,7 +13,7 @@ use \Magento\Framework\App\Response\Http; class HttpTest extends \PHPUnit_Framework_TestCase { /** - * @var \Magento\Framework\App\Response\Http + * @var Http */ protected $model; @@ -32,6 +32,9 @@ class HttpTest extends \PHPUnit_Framework_TestCase */ protected $contextMock; + /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\App\Http\Context */ + protected $dateTimeMock; + protected function setUp() { $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); @@ -41,12 +44,18 @@ class HttpTest extends \PHPUnit_Framework_TestCase $this->cookieManagerMock = $this->getMock('Magento\Framework\Stdlib\CookieManagerInterface'); $this->contextMock = $this->getMockBuilder('Magento\Framework\App\Http\Context')->disableOriginalConstructor() ->getMock(); + + $this->dateTimeMock = $this->getMockBuilder('Magento\Framework\Stdlib\DateTime') + ->disableOriginalConstructor() + ->getMock(); + $this->model = $objectManager->getObject( 'Magento\Framework\App\Response\Http', [ 'cookieManager' => $this->cookieManagerMock, 'cookieMetadataFactory' => $this->cookieMetadataFactoryMock, - 'context' => $this->contextMock + 'context' => $this->contextMock, + 'dateTime' => $this->dateTimeMock ] ); $this->model->headersSentThrowsException = false; @@ -118,14 +127,24 @@ class HttpTest extends \PHPUnit_Framework_TestCase public function testSetPublicHeaders() { $ttl = 120; + $timestamp = 1000000; $pragma = 'cache'; $cacheControl = 'max-age=' . $ttl . ', public, s-maxage=' . $ttl; - $expiresResult = gmdate('D, d M Y H:i:s T', time() + $ttl); + $expiresResult ='Thu, 01 Jan 1970 00:00:00 GMT'; + + $this->dateTimeMock->expects($this->once()) + ->method('strToTime') + ->with('+' . $ttl . ' seconds') + ->willReturn($timestamp); + $this->dateTimeMock->expects($this->once()) + ->method('gmDate') + ->with(Http::EXPIRATION_TIMESTAMP_FORMAT, $timestamp) + ->willReturn($expiresResult); $this->model->setPublicHeaders($ttl); $this->assertEquals($pragma, $this->model->getHeader('Pragma')->getFieldValue()); $this->assertEquals($cacheControl, $this->model->getHeader('Cache-Control')->getFieldValue()); - $this->assertLessThanOrEqual($expiresResult, $this->model->getHeader('Expires')->getFieldValue()); + $this->assertSame($expiresResult, $this->model->getHeader('Expires')->getFieldValue()); } /** @@ -146,14 +165,24 @@ class HttpTest extends \PHPUnit_Framework_TestCase public function testSetPrivateHeaders() { $ttl = 120; + $timestamp = 1000000; $pragma = 'cache'; $cacheControl = 'max-age=' . $ttl . ', private'; - $expires = gmdate('D, d M Y H:i:s T', strtotime('+' . $ttl . ' seconds')); + $expiresResult ='Thu, 01 Jan 1970 00:00:00 GMT'; + + $this->dateTimeMock->expects($this->once()) + ->method('strToTime') + ->with('+' . $ttl . ' seconds') + ->willReturn($timestamp); + $this->dateTimeMock->expects($this->once()) + ->method('gmDate') + ->with(Http::EXPIRATION_TIMESTAMP_FORMAT, $timestamp) + ->willReturn($expiresResult); $this->model->setPrivateHeaders($ttl); $this->assertEquals($pragma, $this->model->getHeader('Pragma')->getFieldValue()); $this->assertEquals($cacheControl, $this->model->getHeader('Cache-Control')->getFieldValue()); - $this->assertEquals($expires, $this->model->getHeader('Expires')->getFieldValue()); + $this->assertEquals($expiresResult, $this->model->getHeader('Expires')->getFieldValue()); } /** @@ -173,14 +202,24 @@ class HttpTest extends \PHPUnit_Framework_TestCase */ public function testSetNoCacheHeaders() { + $timestamp = 1000000; $pragma = 'no-cache'; $cacheControl = 'max-age=0, must-revalidate, no-cache, no-store'; - $expires = gmdate('D, d M Y H:i:s T', strtotime('-1 year')); + $expiresResult ='Thu, 01 Jan 1970 00:00:00 GMT'; + + $this->dateTimeMock->expects($this->once()) + ->method('strToTime') + ->with('-1 year') + ->willReturn($timestamp); + $this->dateTimeMock->expects($this->once()) + ->method('gmDate') + ->with(Http::EXPIRATION_TIMESTAMP_FORMAT, $timestamp) + ->willReturn($expiresResult); $this->model->setNoCacheHeaders(); $this->assertEquals($pragma, $this->model->getHeader('Pragma')->getFieldValue()); $this->assertEquals($cacheControl, $this->model->getHeader('Cache-Control')->getFieldValue()); - $this->assertEquals($expires, $this->model->getHeader('Expires')->getFieldValue()); + $this->assertEquals($expiresResult, $this->model->getHeader('Expires')->getFieldValue()); } /** diff --git a/lib/internal/Magento/Framework/Stdlib/DateTime.php b/lib/internal/Magento/Framework/Stdlib/DateTime.php index fcb268be94313cd381145ff4821f2831a6fd70b4..1de1a555645bd34e09bfe7bb793ca444089fa6ec 100644 --- a/lib/internal/Magento/Framework/Stdlib/DateTime.php +++ b/lib/internal/Magento/Framework/Stdlib/DateTime.php @@ -68,4 +68,31 @@ class DateTime { return preg_replace('#[ 0:-]#', '', $date) === ''; } + + /** + * Wrapper for native gmdate function + * + * @param string $format + * @param int $time + * @return string The given time in given format + * + * @codeCoverageIgnore + */ + public function gmDate($format, $time) + { + return gmdate($format, $time); + } + + /** + * Wrapper for native strtotime function + * + * @param string $timeStr + * @return int + * + * @codeCoverageIgnore + */ + public function strToTime($timeStr) + { + return strtotime($timeStr); + } } diff --git a/lib/internal/Magento/Framework/Stdlib/DateTime/DateTime.php b/lib/internal/Magento/Framework/Stdlib/DateTime/DateTime.php index dc36a0755122edb792c32922c37ff1f8acddf4ee..312a40b1126400c1dd7582cbd0d7b138ad0098cc 100644 --- a/lib/internal/Magento/Framework/Stdlib/DateTime/DateTime.php +++ b/lib/internal/Magento/Framework/Stdlib/DateTime/DateTime.php @@ -63,6 +63,8 @@ class DateTime * @param string $format * @param int|string $input date in current timezone * @return string + * + * @deprecated (MAGETWO-35555) */ public function gmtDate($format = null, $input = null) {