diff options
Diffstat (limited to 'js/index.php')
-rw-r--r-- | js/index.php | 66 |
1 files changed, 58 insertions, 8 deletions
diff --git a/js/index.php b/js/index.php index 60786f2849..afba718085 100644 --- a/js/index.php +++ b/js/index.php @@ -7,18 +7,64 @@ * @version $Id$ */ -$file = "../piwik.js"; +if(!empty($_SERVER['QUERY_STRING'])) { + include '../piwik.php'; + exit; +} -/* - * Conditional GET - */ -if (file_exists($file)) { +$file = '../piwik.js'; + +if (file_exists($file) && function_exists('readfile')) { + // conditional GET $modifiedSince = ''; if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { $modifiedSince = $_SERVER['HTTP_IF_MODIFIED_SINCE']; } $lastModified = gmdate('D, d M Y H:i:s', filemtime($file)) . ' GMT'; + // optional compression + $compressed = false; + $encoding = ''; + if (isset($_SERVER['HTTP_ACCEPT_ENCODING'])) { + $acceptEncoding = $_SERVER['HTTP_ACCEPT_ENCODING']; + if (extension_loaded('zlib') && function_exists('file_get_contents') && function_exists('file_put_contents')) { + if (preg_match('/(?:^|, ?)(deflate)(?:,|$)/', $acceptEncoding, $matches)) { + $encoding = 'deflate'; + $filegz = '../piwik.js.deflate'; + } else if (preg_match('/(?:^|, ?)((x-)?gzip)(?:,|$)/', $acceptEncoding, $matches)) { + $encoding = $matches[1]; + $filegz = '../piwik.js.gz'; + } + + if (!empty($encoding)) { + // compress-on-demand and use cache + if(!file_exists($filegz) || (filemtime($file) > filemtime($filegz))) { + $data = file_get_contents($file); + + if ($encoding == 'deflate') { + $data = gzcompress($data, 9); + } else if ($encoding == 'gzip' || $encoding == 'x-gzip') { + $data = gzencode($data, 9); + } + + file_put_contents($filegz, $data); + $file = $filegz; + } + + $compressed = true; + $file = $filegz; + } + } else { + // manually compressed + $filegz = '../piwik.js.gz'; + if (preg_match('/(?:^|, ?)((x-)?gzip)(?:,|$)/', $acceptEncoding, $matches) && file_exists($filegz) && (filemtime($file) < filemtime($filegz))) { + $encoding = $matches[1]; + $compressed = true; + $file = $filegz; + } + } + } + // strip any trailing data appended to header if (false !== ($semicolon = strpos($modifiedSince, ';'))) { $modifiedSince = substr($modifiedSince, 0, $semicolon); @@ -29,13 +75,17 @@ if (file_exists($file)) { } else { header('Last-Modified: ' . $lastModified); header('Content-Length: ' . filesize($file)); - header('Content-Type: application/x-javascript'); + header('Content-Type: application/javascript; charset=UTF-8'); + + if ($compressed) { + header('Content-Encoding: ' . $encoding); + } if (!readfile($file)) { - header ("HTTP/1.0 505 Internal server error"); + header ('HTTP/1.0 505 Internal server error'); } } } else { - header ("HTTP/1.0 404 Not Found"); + header ('HTTP/1.0 404 Not Found'); } exit; |