From 388d8405bb10b3b2107629f8cd4133bff3a7693c Mon Sep 17 00:00:00 2001 From: brettp Date: Wed, 13 Apr 2011 14:39:21 +0000 Subject: Consolidated the css and js pagehandlers with elgg_cachable_view_pagehandler() and fixed for URLs with multiple dots after the last / (like /js/calendars/fullcalendar.min.123456789.js) git-svn-id: http://code.elgg.org/elgg/trunk@8985 36083f99-b078-4883-b0ff-0f9b5a30f544 --- engine/lib/elgglib.php | 76 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 23 deletions(-) (limited to 'engine/lib/elgglib.php') diff --git a/engine/lib/elgglib.php b/engine/lib/elgglib.php index 1aef48ef4..063e25fc4 100644 --- a/engine/lib/elgglib.php +++ b/engine/lib/elgglib.php @@ -1685,21 +1685,7 @@ function _elgg_shutdown_hook() { * @elgg_pagehandler js */ function elgg_js_page_handler($page) { - if (is_array($page) && sizeof($page)) { - $js = implode('/', $page); - $js = substr($js, 0, strpos($js, '.')); - $return = elgg_view('js/' . $js); - - header('Content-type: text/javascript'); - - // @todo should js be cached when simple cache turned off - //header('Expires: ' . date('r', time() + 864000)); - //header("Pragma: public"); - //header("Cache-Control: public"); - //header("Content-Length: " . strlen($return)); - - echo $return; - } + return elgg_cacheable_view_page_handler($page, 'js'); } /** @@ -1749,18 +1735,62 @@ function elgg_css_page_handler($page) { // default css $page[0] = 'elgg'; } + + return elgg_cacheable_view_page_handler($page, 'css'); +} + +/** + * Serves a JS or CSS view with headers for caching. + * + * //name/of/view.. + * + * @param array $page The page array + * @param string $type The type: js or css + * + * @return mixed + */ +function elgg_cacheable_view_page_handler($page, $type) { + + switch ($type) { + case 'js': + $content_type = 'text/javascript'; + break; + + case 'css': + $content_type = 'text/css'; + break; + + default: + return false; + break; + } + + if ($page) { + // the view file names can have multiple dots + // eg: views/default/js/calendars/jquery.fullcalendar.min.php + // translates to the url /js/calendars/jquery.fullcalendar.min..js + // and the view js/calendars/jquery.fullcalendar.min + // we ignore the last two dots for the ts and the ext. + $last_part = array_pop($page); + $last_part_bits = explode('.', $last_part); + $last_part_bits = array_slice($last_part_bits, 0, -2); + $page[] = implode('.', $last_part_bits); - $css = substr($page[0], 0, strpos($page[0], '.')); - $return = elgg_view("css/$css"); + $view = implode('/', $page); + $return = elgg_view("$type/$view"); + + header("Content-type: $content_type"); - header("Content-type: text/css", true); + // @todo should js be cached when simple cache turned off + //header('Expires: ' . date('r', time() + 864000)); + //header("Pragma: public"); + //header("Cache-Control: public"); + //header("Content-Length: " . strlen($return)); - // @todo should css be cached when simple cache is turned off - //header('Expires: ' . date('r', time() + 86400000), true); - //header("Pragma: public", true); - //header("Cache-Control: public", true); + echo $return; + } - echo $return; + return true; } /** -- cgit v1.2.3 From d87b6ffe7312888d109428e6a939f33394549677 Mon Sep 17 00:00:00 2001 From: brettp Date: Wed, 13 Apr 2011 19:30:44 +0000 Subject: Fixes #3331. Changed cache schema to allow for JS/CSS views with slashes and dots. git-svn-id: http://code.elgg.org/elgg/trunk@8986 36083f99-b078-4883-b0ff-0f9b5a30f544 --- engine/handlers/cache_handler.php | 15 +++++++++------ engine/lib/cache.php | 2 +- engine/lib/elgglib.php | 10 ++++------ 3 files changed, 14 insertions(+), 13 deletions(-) (limited to 'engine/lib/elgglib.php') diff --git a/engine/handlers/cache_handler.php b/engine/handlers/cache_handler.php index 05c35171b..7d6f42dc3 100644 --- a/engine/handlers/cache_handler.php +++ b/engine/handlers/cache_handler.php @@ -3,7 +3,7 @@ * Cache handler. * * External access to cached CSS and JavaScript views. The cached file URLS - * should be of the form: cache//// where + * should be of the form: cache///.. where * type is either css or js, view is the name of the cached view, and * unique_id is an identifier that is updated every time the cache is flushed. * The simplest way to maintain a unique identifier is to use the lastcache @@ -50,13 +50,16 @@ if (!$request || !$simplecache_enabled) { echo 'Cache error: bad request'; exit; } -$request = explode('/', $request); +// testing showed regex to be marginally faster than array / string functions over 100000 reps +// it won't make a difference in real life and regex is easier to read. +// //.. +$regex = '|([^/]+)/([^/]+)/(.+)\.([^\.]+)\.([^.]+)$|'; +preg_match($regex, $request, $matches); -//cache//// -$type = $request[0]; -$view = $request[1]; -$viewtype = $request[2]; +$type = $matches[1]; +$viewtype = $matches[2]; +$view = $matches[3]; switch ($type) { case 'css': diff --git a/engine/lib/cache.php b/engine/lib/cache.php index d4888f9d9..8529ae7fa 100644 --- a/engine/lib/cache.php +++ b/engine/lib/cache.php @@ -166,7 +166,7 @@ function elgg_get_simplecache_url($type, $view) { if (elgg_is_simplecache_enabled()) { $viewtype = elgg_get_viewtype(); - $url = elgg_get_site_url() . "cache/$type/$view/$viewtype/$view.$lastcache.$type"; + $url = elgg_get_site_url() . "cache/$type/$viewtype/$view.$lastcache.$type"; } else { $url = elgg_get_site_url() . "$type/$view.$lastcache.$type"; } diff --git a/engine/lib/elgglib.php b/engine/lib/elgglib.php index 063e25fc4..a800aca7a 100644 --- a/engine/lib/elgglib.php +++ b/engine/lib/elgglib.php @@ -1771,12 +1771,10 @@ function elgg_cacheable_view_page_handler($page, $type) { // translates to the url /js/calendars/jquery.fullcalendar.min..js // and the view js/calendars/jquery.fullcalendar.min // we ignore the last two dots for the ts and the ext. - $last_part = array_pop($page); - $last_part_bits = explode('.', $last_part); - $last_part_bits = array_slice($last_part_bits, 0, -2); - $page[] = implode('.', $last_part_bits); - - $view = implode('/', $page); + $page = implode('/', $page); + $regex = '|(.+)\.([^\.]+)\.([^.]+)$|'; + preg_match($regex, $page, $matches); + $view = $matches[1]; $return = elgg_view("$type/$view"); header("Content-type: $content_type"); -- cgit v1.2.3 From 6f6f9abc3d45dc305ab8ea8dfd53f7f975982228 Mon Sep 17 00:00:00 2001 From: cash Date: Thu, 14 Apr 2011 11:25:47 +0000 Subject: fixed filtering of external files array and suppressed warning in external files unit test git-svn-id: http://code.elgg.org/elgg/trunk@8998 36083f99-b078-4883-b0ff-0f9b5a30f544 --- engine/lib/elgglib.php | 2 +- engine/tests/api/helpers.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'engine/lib/elgglib.php') diff --git a/engine/lib/elgglib.php b/engine/lib/elgglib.php index a800aca7a..6c94133df 100644 --- a/engine/lib/elgglib.php +++ b/engine/lib/elgglib.php @@ -400,7 +400,7 @@ function elgg_get_loaded_external_files($type, $location) { if (isset($CONFIG->externals) && isset($CONFIG->externals[$type])) { $items = array_values($CONFIG->externals[$type]); - $callback = "return \$v->loaded == true && \$v->location == $location;"; + $callback = "return \$v->loaded == true && \$v->location == '$location';"; $items = array_filter($items, create_function('$v', $callback)); if ($items) { usort($items, create_function('$a,$b','return $a->priority >= $b->priority;')); diff --git a/engine/tests/api/helpers.php b/engine/tests/api/helpers.php index 1362b3c9d..461627547 100644 --- a/engine/tests/api/helpers.php +++ b/engine/tests/api/helpers.php @@ -109,7 +109,7 @@ class ElggCoreHelpersTest extends ElggCoreUnitTest { $this->assertIdentical('http://test1.com', $CONFIG->externals['js']['key']->url); // send a bad url - $result = elgg_register_js(); + $result = @elgg_register_js('bad'); $this->assertFalse($result); } @@ -140,7 +140,7 @@ class ElggCoreHelpersTest extends ElggCoreUnitTest { $result = elgg_unregister_js('id1'); $this->assertTrue($result); - $this->assertNULL($CONFIG->externals['js']['head']['id1']); + @$this->assertNULL($CONFIG->externals['js']['head']['id1']); $result = elgg_unregister_js('id1'); $this->assertFalse($result); -- cgit v1.2.3