diff options
Diffstat (limited to 'modules/gallery')
-rw-r--r-- | modules/gallery/controllers/javascript.php | 64 | ||||
-rw-r--r-- | modules/gallery/libraries/Theme_View.php | 29 |
2 files changed, 90 insertions, 3 deletions
diff --git a/modules/gallery/controllers/javascript.php b/modules/gallery/controllers/javascript.php new file mode 100644 index 00000000..d3c0ded5 --- /dev/null +++ b/modules/gallery/controllers/javascript.php @@ -0,0 +1,64 @@ +<?php defined("SYSPATH") or die("No direct script access."); +/** + * Gallery - a web based photo album viewer and editor + * Copyright (C) 2000-2009 Bharat Mediratta + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ +class Javascript_Controller extends Controller { + public function combined($key) { + if (preg_match('/[^0-9a-f]/', $key)) { + /* The key can't contain non-hex, so just terminate early */ + Kohana::show_404(); + } + + // We don't need to save the session for this request + Session::abort_save(); + + Kohana::log("error", Kohana::debug($_SERVER)); + // Dump out the javascript file + $ext = strpos($_SERVER["HTTP_ACCEPT_ENCODING"], "gzip") !== false ? "_gzip" : ""; + $file = VARPATH . "tmp/CombinedJavascript_$key{$ext}"; + + if (!file_exists($file)) { + Kohana::show_404(); + } + + $stats = stat($file); + if (!empty($_SERVER["HTTP_IF_MODIFIED_SINCE"]) && + $stats[9] <= $_SERVER["HTTP_IF_MODIFIED_SINCE"]) { + header("HTTP/1.0 304 Not Modified"); + return; + } + + Kohana::log("error", Kohana::debug($_SERVER)); + if (strpos($_SERVER["HTTP_ACCEPT_ENCODING"], "gzip") !== false) { + header("Content-Encoding: gzip"); + header("Cache-Control: private, x-gzip-ok=\"public\""); + } + + header("Content-Type: text/javascript; charset=UTF-8"); + + header("Expires: " . gmdate(21474383647)); + header("Last-Modified: " . gmdate($stats[9])); + + Kohana::close_buffers(false); + + $fd = fopen($file, "rb"); + fpassthru($fd); + fclose($fd); + } +} + diff --git a/modules/gallery/libraries/Theme_View.php b/modules/gallery/libraries/Theme_View.php index 7696f3b0..1746f1d2 100644 --- a/modules/gallery/libraries/Theme_View.php +++ b/modules/gallery/libraries/Theme_View.php @@ -170,11 +170,34 @@ class Theme_View_Core extends View { private function _combine_script() { $links = array(); - Kohana::log("error", Kohana::debug($this->scripts)); + $key = ""; foreach (array_keys($this->scripts) as $file) { - $links[] = html::script($file); + $path = DOCROOT . $file; + if (file_exists($path)) { + $stats = stat($path); + $links[] = $path; + // 7 == size, 9 == mtime, see http://php.net/stat + $key = "{$key}$file $stats[7] $stats[9],"; + } else { + Kohana::log("warn", "Javascript file missing: " . $file); + } + } + + $key = md5($key); + $file = "tmp/CombinedJavascript_$key"; + if (!file_exists(VARPATH . $file)) { + $contents = ''; + foreach ($links as $link) { + $contents .= file_get_contents($link); + } + file_put_contents(VARPATH . $file, $contents); + if (function_exists("gzencode")) { + file_put_contents(VARPATH . "{$file}_gzip", gzencode($contents, 9, FORCE_GZIP)); + } } - return empty($links) ? "" : implode("\n", $links); + + return "<script type=\"text/javascript\" src=\"" . url::site("javascript/combined/$key") . + "\"></script>"; } /** |