diff --git a/src/Controllers/AbstractController.php b/src/Controllers/AbstractController.php index dc926c86..ce2a797b 100644 --- a/src/Controllers/AbstractController.php +++ b/src/Controllers/AbstractController.php @@ -23,10 +23,10 @@ class AbstractController $this->renderView(null); } - public function renderFile() + public function renderFile(FileRendererOptions $options) { - $this->switchLayout('layout-file'); - $this->renderView(null); + $fileRenderer = new FileRenderer(); + $fileRenderer->render($options); } public function renderView($viewName) diff --git a/src/Controllers/PostController.php b/src/Controllers/PostController.php index 21f7a113..ef22b9d7 100644 --- a/src/Controllers/PostController.php +++ b/src/Controllers/PostController.php @@ -157,13 +157,13 @@ class PostController extends AbstractController try { TransferHelper::download($url, $tmpPath); - $context = Core::getContext(); - $context->transport->lastModified = time(); - $context->transport->mimeType = mime_content_type($tmpPath); - $context->transport->cacheDaysToLive = 0.5; - $context->transport->fileHash = md5($url); - $context->transport->fileContent = file_get_contents($tmpPath); - $this->renderFile(); + $options = new FileRendererOptions(); + $options->lastModified = time(); + $options->mimeType = mime_content_type($tmpPath); + $options->cacheDaysToLive = 0.5; + $options->fileHash = md5($url); + $options->fileContent = file_get_contents($tmpPath); + $this->renderFile($options); } finally { @@ -336,28 +336,28 @@ class PostController extends AbstractController { $ret = Api::run(new GetPostContentJob(), [JobArgs::ARG_POST_NAME => $name]); - $context = Core::getContext(); - $context->transport->cacheDaysToLive = 14; - $context->transport->customFileName = $ret->fileName; - $context->transport->mimeType = $ret->mimeType; - $context->transport->fileHash = 'post' . md5(substr($ret->fileContent, 0, 4096)); - $context->transport->fileContent = $ret->fileContent; - $context->transport->lastModified = $ret->lastModified; - $this->renderFile(); + $options = new FileRendererOptions(); + $options->cacheDaysToLive = 14; + $options->customFileName = $ret->fileName; + $options->mimeType = $ret->mimeType; + $options->fileHash = 'post' . md5(substr($ret->fileContent, 0, 4096)); + $options->fileContent = $ret->fileContent; + $options->lastModified = $ret->lastModified; + $this->renderFile($options); } public function thumbnailView($name) { $ret = Api::run(new GetPostThumbnailJob(), [JobArgs::ARG_POST_NAME => $name]); - $context = Core::getContext(); - $context->transport->cacheDaysToLive = 365; - $context->transport->customFileName = $ret->fileName; - $context->transport->mimeType = 'image/jpeg'; - $context->transport->fileHash = 'thumb' . md5(substr($ret->fileContent, 0, 4096)); - $context->transport->fileContent = $ret->fileContent; - $context->transport->lastModified = $ret->lastModified; - $this->renderFile(); + $options = new FileRendererOptions(); + $options->cacheDaysToLive = 365; + $options->customFileName = $ret->fileName; + $options->mimeType = 'image/jpeg'; + $options->fileHash = 'thumb' . md5(substr($ret->fileContent, 0, 4096)); + $options->fileContent = $ret->fileContent; + $options->lastModified = $ret->lastModified; + $this->renderFile($options); } diff --git a/src/FileRenderer.php b/src/FileRenderer.php new file mode 100644 index 00000000..1fe6d45c --- /dev/null +++ b/src/FileRenderer.php @@ -0,0 +1,43 @@ +lastModified; + $eTag = $options->fileHash; + $ttl = $options->cacheDaysToLive * 24 * 3600; + + $ifModifiedSince = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) + ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] + : false; + + $eTagHeader = isset($_SERVER['HTTP_IF_NONE_MATCH']) + ? trim(trim($_SERVER['HTTP_IF_NONE_MATCH']), '"') + : false; + + \Chibi\Util\Headers::set('ETag', '"' . $eTag . '"'); + \Chibi\Util\Headers::set('Last-Modified', gmdate('D, d M Y H:i:s \G\M\T', $lastModified)); + \Chibi\Util\Headers::set('Pragma', 'public'); + \Chibi\Util\Headers::set('Cache-Control', 'public, max-age=' . $ttl); + \Chibi\Util\Headers::set('Expires', gmdate('D, d M Y H:i:s \G\M\T', time() + $ttl)); + + if (isset($options->customFileName)) + { + \Chibi\Util\Headers::set( + 'Content-Disposition', + 'inline; filename="' . $options->customFileName . '"'); + } + + \Chibi\Util\Headers::set('Content-Type', $options->mimeType); + + if (strtotime($ifModifiedSince) == $lastModified or $eTagHeader == $eTag) + { + \Chibi\Util\Headers::setCode('304'); + exit; + } + + echo $options->fileContent; + + flush(); + } +} diff --git a/src/FileRendererOptions.php b/src/FileRendererOptions.php new file mode 100644 index 00000000..646a3383 --- /dev/null +++ b/src/FileRendererOptions.php @@ -0,0 +1,10 @@ +context->transport->lastModified; -$eTag = $this->context->transport->fileHash; -$ttl = $this->context->transport->cacheDaysToLive * 24 * 3600; - -$ifModifiedSince = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) - ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] - : false; - -$eTagHeader = isset($_SERVER['HTTP_IF_NONE_MATCH']) - ? trim(trim($_SERVER['HTTP_IF_NONE_MATCH']), '"') - : false; - -\Chibi\Util\Headers::set('ETag', '"' . $eTag . '"'); -\Chibi\Util\Headers::set('Last-Modified', gmdate('D, d M Y H:i:s \G\M\T', $lastModified)); -\Chibi\Util\Headers::set('Pragma', 'public'); -\Chibi\Util\Headers::set('Cache-Control', 'public, max-age=' . $ttl); -\Chibi\Util\Headers::set('Expires', gmdate('D, d M Y H:i:s \G\M\T', time() + $ttl)); - -if (isset($this->context->transport->customFileName)) -{ - \Chibi\Util\Headers::set( - 'Content-Disposition', - 'inline; filename="' . $this->context->transport->customFileName . '"'); -} - -\Chibi\Util\Headers::set( - 'Content-Type', - $this->context->transport->mimeType); - -if (strtotime($ifModifiedSince) == $lastModified or $eTagHeader == $eTag) -{ - \Chibi\Util\Headers::setCode('304'); - exit; -} - -echo $this->context->transport->fileContent; -flush();