diff options
Diffstat (limited to 'engine/handlers')
| -rw-r--r-- | engine/handlers/action_handler.php | 2 | ||||
| -rw-r--r-- | engine/handlers/cache_handler.php | 65 | ||||
| -rw-r--r-- | engine/handlers/export_handler.php | 14 | ||||
| -rw-r--r-- | engine/handlers/page_handler.php | 30 | ||||
| -rw-r--r-- | engine/handlers/service_handler.php | 2 | ||||
| -rw-r--r-- | engine/handlers/xml-rpc_handler.php | 2 |
6 files changed, 77 insertions, 38 deletions
diff --git a/engine/handlers/action_handler.php b/engine/handlers/action_handler.php index cf6c8c9eb..bcad110b2 100644 --- a/engine/handlers/action_handler.php +++ b/engine/handlers/action_handler.php @@ -17,4 +17,4 @@ require_once(dirname(dirname(__FILE__)) . "/start.php"); $action = get_input("action"); -action($action);
\ No newline at end of file +action($action); diff --git a/engine/handlers/cache_handler.php b/engine/handlers/cache_handler.php index 9377282a4..36fc665bb 100644 --- a/engine/handlers/cache_handler.php +++ b/engine/handlers/cache_handler.php @@ -1,15 +1,15 @@ <?php /** * Cache handler. - * + * * External access to cached CSS and JavaScript views. The cached file URLS - * should be of the form: cache/<type>/<view>/<viewtype>/<unique_id> where + * should be of the form: cache/<type>/<viewtype>/<name/of/view>.<unique_id>.<type> 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 * variable in Elgg's config object. * - * @see elgg_view_register_simplecache() + * @see elgg_register_simplecache_view() * * @package Elgg.Core * @subpackage Cache @@ -28,63 +28,78 @@ if (!mysql_select_db($CONFIG->dbname, $mysql_dblink)) { exit; } -$query = "select name, value from {$CONFIG->dbprefix}datalists where name = 'dataroot'"; +$query = "select name, value from {$CONFIG->dbprefix}datalists + where name in ('dataroot', 'simplecache_enabled')"; + $result = mysql_query($query, $mysql_dblink); if (!$result) { echo 'Cache error: unable to get the data root'; exit; } -$row = mysql_fetch_object($result); +while ($row = mysql_fetch_object($result)) { + ${$row->name} = $row->value; +} mysql_free_result($result); -$dataroot = $row->value; - $dirty_request = $_GET['request']; // only alphanumeric characters plus /, ., and _ and no '..' $filter = array("options" => array("regexp" => "/^(\.?[_a-zA-Z0-9\/]+)+$/")); $request = filter_var($dirty_request, FILTER_VALIDATE_REGEXP, $filter); -if (!$request) { +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. +// <type>/<viewtype>/<name/of/view.and.dots>.<ts>.<type> +$regex = '|([^/]+)/([^/]+)/(.+)\.([^\.]+)\.([^.]+)$|'; +preg_match($regex, $request, $matches); -//cache/<type>/<view>/<viewtype>/ -$type = $request[0]; -$view = $request[1]; -$viewtype = $request[2]; +$type = $matches[1]; +$viewtype = $matches[2]; +$view = $matches[3]; +$ts = $matches[4]; + +// If is the same ETag, content didn't changed. +$etag = $ts; +if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && trim($_SERVER['HTTP_IF_NONE_MATCH']) == "\"$etag\"") { + header("HTTP/1.1 304 Not Modified"); + exit; +} switch ($type) { case 'css': header("Content-type: text/css", true); - header('Expires: ' . date('r', time() + 86400000), true); - header("Pragma: public", true); - header("Cache-Control: public", true); - $view = "css/$view"; break; case 'js': header('Content-type: text/javascript', true); - header('Expires: ' . date('r', time() + 864000000), true); - header("Pragma: public", true); - header("Cache-Control: public", true); - $view = "js/$view"; break; } +header('Expires: ' . gmdate('D, d M Y H:i:s \G\M\T', strtotime("+6 months")), true); +header("Pragma: public", true); +header("Cache-Control: public", true); +header("ETag: \"$etag\""); + $filename = $dataroot . 'views_simplecache/' . md5($viewtype . $view); if (file_exists($filename)) { - $contents = file_get_contents($filename); + readfile($filename); } else { // someone trying to access a non-cached file or a race condition with cache flushing mysql_close($mysql_dblink); require_once(dirname(dirname(__FILE__)) . "/start.php"); + + global $CONFIG; + if (!in_array($view, $CONFIG->views->simplecache)) { + header("HTTP/1.1 404 Not Found"); + exit; + } + elgg_set_viewtype($viewtype); - $contents = elgg_view($view); + echo elgg_view($view); } - -echo $contents; diff --git a/engine/handlers/export_handler.php b/engine/handlers/export_handler.php index da83ce43c..aa5214c23 100644 --- a/engine/handlers/export_handler.php +++ b/engine/handlers/export_handler.php @@ -63,17 +63,19 @@ if (($guid != "") && ($type == "") && ($id_or_name == "")) { $m->type = "attr"; break; case 'metadata' : - $m = get_metadata($id_or_name); + $m = elgg_get_metadata_from_id($id_or_name); break; case 'annotation' : - $m = get_annotation($id_or_name); + $m = elgg_get_annotation_from_id($id_or_name); break; case 'relationship' : $r = get_relationship($id_or_name); break; case 'volatile' : - $m = elgg_trigger_plugin_hook('volatile', 'metadata', - array('guid' => $guid, 'varname' => $id_or_name)); + $m = elgg_trigger_plugin_hook('volatile', 'metadata', array( + 'guid' => $guid, + 'varname' => $id_or_name, + )); break; default : @@ -112,5 +114,5 @@ if (($guid != "") && ($type == "") && ($id_or_name == "")) { } $content = elgg_view_title($title) . $body; -$body = elgg_view_layout('one_column_with_sidebar', array('content' => $content)); -echo elgg_view_page($title, $body);
\ No newline at end of file +$body = elgg_view_layout('one_sidebar', array('content' => $content)); +echo elgg_view_page($title, $body); diff --git a/engine/handlers/page_handler.php b/engine/handlers/page_handler.php index 7d293c3e4..1ed295b7d 100644 --- a/engine/handlers/page_handler.php +++ b/engine/handlers/page_handler.php @@ -3,12 +3,24 @@ * Pages handler. * * This file dispatches pages. It is called via a URL rewrite in .htaccess - * from http://site/pg/handler/page1/page2. The first element after 'pg/' is - * the page handler name as registered by {@link register_page_handler()}. + * from http://site/handler/page1/page2. The first element after site/ is + * the page handler name as registered by {@link elgg_register_page_handler()}. * The rest of the string is sent to {@link page_handler()}. + * + * Note that the following handler names are reserved by elgg and should not be + * registered by any plugins: + * * action + * * cache + * * services + * * export + * * mt + * * xml-rpc.php + * * rewrite.php + * * tag (deprecated, reserved for backwards compatibility) + * * pg (deprecated, reserved for backwards compatibility) * * {@link page_handler()} explodes the pages string by / and sends it to - * the page handler function as registered by {@link register_page_handler()}. + * the page handler function as registered by {@link elgg_register_page_handler()}. * If a valid page handler isn't found, plugins have a chance to provide a 404. * * @package Elgg.Core @@ -16,6 +28,16 @@ * @link http://docs.elgg.org/Tutorials/PageHandlers */ + +// Permanent redirect to pg-less urls +$url = $_SERVER['REQUEST_URI']; +$new_url = preg_replace('#/pg/#', '/', $url, 1); + +if ($url !== $new_url) { + header("HTTP/1.1 301 Moved Permanently"); + header("Location: $new_url"); +} + require_once(dirname(dirname(__FILE__)) . "/start.php"); $handler = get_input('handler'); @@ -23,4 +45,4 @@ $page = get_input('page'); if (!page_handler($handler, $page)) { forward('', '404'); -}
\ No newline at end of file +} diff --git a/engine/handlers/service_handler.php b/engine/handlers/service_handler.php index a23528be8..9cfcd230f 100644 --- a/engine/handlers/service_handler.php +++ b/engine/handlers/service_handler.php @@ -24,4 +24,4 @@ require_once(dirname(dirname(__FILE__)) . "/start.php"); $handler = get_input('handler'); $request = get_input('request'); -service_handler($handler, $request);
\ No newline at end of file +service_handler($handler, $request); diff --git a/engine/handlers/xml-rpc_handler.php b/engine/handlers/xml-rpc_handler.php index c5dedea1d..2ee29e5b7 100644 --- a/engine/handlers/xml-rpc_handler.php +++ b/engine/handlers/xml-rpc_handler.php @@ -41,4 +41,4 @@ if (!($result instanceof XMLRPCResponse)) { } // Output result -echo elgg_view_page("XML-RPC", elgg_view("xml-rpc/output", array('result' => $result)));
\ No newline at end of file +echo elgg_view_page("XML-RPC", elgg_view("xml-rpc/output", array('result' => $result))); |
