From 0a09700828a6fe745e0dbd9b9f2d2a63751dfb8e Mon Sep 17 00:00:00 2001 From: coderkun Date: Fri, 14 Feb 2014 20:45:10 +0100 Subject: [PATCH] set caching headers for media --- controllers/MediaController.inc | 62 +++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/controllers/MediaController.inc b/controllers/MediaController.inc index bb3feede..aa69e704 100644 --- a/controllers/MediaController.inc +++ b/controllers/MediaController.inc @@ -45,6 +45,24 @@ + /** + * Prefilter. + * + * @param Request $request Current request + * @param Response $response Current response + */ + public function preFilter(\nre\core\Request $request, \nre\core\Response $response) + { + parent::preFilter($request, $response); + + // Set headers for caching control + $response->addHeader("Pragma: public"); + $response->addHeader("Cache-control: public, max-age=".(60*60*24)); + $response->addHeader("Expires: ".gmdate('r', time()+(60*60*24))); + $response->addHeader("Date: ".gmdate(\DateTime::RFC822)); + } + + /** * Action: index. * @@ -71,11 +89,55 @@ throw new \nre\exceptions\IdNotFoundException($mediaUrl); } + // Cache + if($this->setCacheHeaders($media['filename'])) { + return; + } + // Pass data to view $this->set('media', $media); } + + + + /** + * Determine file information and set the HTTP-header for + * caching accordingly. + * + * @param string $fileName Filename + * @return boolean HTTP-status 304 was set (in cache) + */ + private function setCacheHeaders($fileName) + { + // Determine last change of file + $fileLastModified = gmdate('r', filemtime($fileName)); + + // Generate E-Tag + $fileEtag = hash('sha256', $fileLastModified.$fileName); + + + // Set header + $this->response->addHeader("Last-Modified: ".$fileLastModified); + $this->response->addHeader("Etag: ".$fileEtag); + // HTTP-status + $headerModifiedSince = $this->request->getServerParam('HTTP_IF_MODIFIED_SINCE'); + $headerNoneMatch = $this->request->getServerParam('HTTP_IF_NONE_MATCH'); + if( + !is_null($headerModifiedSince) && $fileLastModified < strtotime($headerModifiedSince) && + !is_null($headerNoneMatch) && $headerNoneMatch == $fileEtag + ) { + $this->response->setExit(true); + $this->response->addHeader(\nre\core\WebUtils::getHttpHeader(304)); + + return true; + } + + + return false; + } + } ?>