X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Frouter.php;h=1fb516562192aa34bc5d91f5d8d3b921df887676;hb=7d64d8c78cfa102b91975598ef9e574d2ef14b8c;hp=180d8f791b97d3bc351984ad9effbf17f1ca2715;hpb=e274ec4900172b5a53f38e5d9f44d899bf490dc3;p=quix0rs-gnu-social.git diff --git a/lib/router.php b/lib/router.php index 180d8f791b..1fb5165621 100644 --- a/lib/router.php +++ b/lib/router.php @@ -31,73 +31,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } -require_once 'Net/URL/Mapper.php'; - -class StatusNet_URL_Mapper extends Net_URL_Mapper -{ - private static $_singleton = null; - private $_actionToPath = array(); - - private function __construct() - { - } - - public static function getInstance($id = '__default__') - { - if (empty(self::$_singleton)) { - self::$_singleton = new StatusNet_URL_Mapper(); - } - return self::$_singleton; - } - - public function connect($path, $defaults = array(), $rules = array()) - { - $result = null; - if (Event::handle('StartConnectPath', array(&$path, &$defaults, &$rules, &$result))) { - $result = parent::connect($path, $defaults, $rules); - if (array_key_exists('action', $defaults)) { - $action = $defaults['action']; - } elseif (array_key_exists('action', $rules)) { - $action = $rules['action']; - } else { - $action = null; - } - $this->_mapAction($action, $result); - Event::handle('EndConnectPath', array($path, $defaults, $rules, $result)); - } - return $result; - } - - protected function _mapAction($action, $path) - { - if (!array_key_exists($action, $this->_actionToPath)) { - $this->_actionToPath[$action] = array(); - } - $this->_actionToPath[$action][] = $path; - return; - } - - public function generate($values = array(), $qstring = array(), $anchor = '') - { - if (!array_key_exists('action', $values)) { - return parent::generate($values, $qstring, $anchor); - } - - $action = $values['action']; - - if (!array_key_exists($action, $this->_actionToPath)) { - return parent::generate($values, $qstring, $anchor); - } - - $oldPaths = $this->paths; - $this->paths = $this->_actionToPath[$action]; - $result = parent::generate($values, $qstring, $anchor); - $this->paths = $oldPaths; - - return $result; - } -} - /** * URL Router * @@ -136,19 +69,7 @@ class Router function __construct() { if (empty($this->m)) { - if (!common_config('router', 'cache')) { - $this->m = $this->initialize(); - } else { - $k = self::cacheKey(); - $c = Cache::instance(); - $m = $c->get($k); - if (!empty($m)) { - $this->m = $m; - } else { - $this->m = $this->initialize(); - $c->set($k, $this->m); - } - } + $this->m = $this->initialize(); } } @@ -159,8 +80,8 @@ class Router * you're running and the plugins that are enabled. To avoid having bad routes * get stuck in the cache, the key includes a list of plugins and the software * version. - * - * There can still be problems with a) differences in versions of the plugins and + * + * There can still be problems with a) differences in versions of the plugins and * b) people running code between official versions, but these tend to be more * sophisticated users who can grok what's going on and clear their caches. * @@ -183,7 +104,7 @@ class Router function initialize() { - $m = StatusNet_URL_Mapper::getInstance(); + $m = new URLMapper(); if (Event::handle('StartInitializeRouter', array(&$m))) { @@ -203,6 +124,20 @@ class Router array('user_id' => '[0-9]+', 'token' => '.+')); + // these take a code; before the main part + + foreach (array('register', 'confirmaddress', 'recoverpassword') as $c) { + $m->connect('main/'.$c.'/:code', array('action' => $c)); + } + + // Also need a block variant accepting ID on URL for mail links + $m->connect('main/block/:profileid', + array('action' => 'block'), + array('profileid' => '[0-9]+')); + + $m->connect('main/sup/:seconds', array('action' => 'sup'), + array('seconds' => '[0-9]+')); + // main stuff is repetitive $main = array('login', 'logout', 'register', 'subscribe', @@ -227,18 +162,11 @@ class Router $m->connect('main/'.$a, array('action' => $a)); } - // Also need a block variant accepting ID on URL for mail links - $m->connect('main/block/:profileid', - array('action' => 'block'), - array('profileid' => '[0-9]+')); - - $m->connect('main/sup/:seconds', array('action' => 'sup'), - array('seconds' => '[0-9]+')); - - $m->connect('main/tagprofile', array('action' => 'tagprofile')); $m->connect('main/tagprofile/:id', array('action' => 'tagprofile'), array('id' => '[0-9]+')); + $m->connect('main/tagprofile', array('action' => 'tagprofile')); + $m->connect('main/oembed', array('action' => 'oembed')); @@ -249,12 +177,6 @@ class Router $m->connect('main/xrd', array('action' => 'userxrd')); - // these take a code - - foreach (array('register', 'confirmaddress', 'recoverpassword') as $c) { - $m->connect('main/'.$c.'/:code', array('action' => $c)); - } - // settings foreach (array('profile', 'avatar', 'password', 'im', 'oauthconnections', @@ -281,18 +203,18 @@ class Router // search foreach (array('group', 'people', 'notice') as $s) { - $m->connect('search/'.$s, array('action' => $s.'search')); $m->connect('search/'.$s.'?q=:q', array('action' => $s.'search'), array('q' => '.+')); + $m->connect('search/'.$s, array('action' => $s.'search')); } // The second of these is needed to make the link work correctly // when inserted into the page. The first is needed to match the // route on the way in. Seems to be another Net_URL_Mapper bug to me. - $m->connect('search/notice/rss', array('action' => 'noticesearchrss')); $m->connect('search/notice/rss?q=:q', array('action' => 'noticesearchrss'), array('q' => '.+')); + $m->connect('search/notice/rss', array('action' => 'noticesearchrss')); $m->connect('attachment/:attachment', array('action' => 'attachment'), @@ -306,15 +228,17 @@ class Router array('action' => 'attachment_thumbnail'), array('attachment' => '[0-9]+')); - $m->connect('notice/new', array('action' => 'newnotice')); - $m->connect('notice/new?replyto=:replyto', - array('action' => 'newnotice'), - array('replyto' => Nickname::DISPLAY_FMT)); $m->connect('notice/new?replyto=:replyto&inreplyto=:inreplyto', array('action' => 'newnotice'), array('replyto' => Nickname::DISPLAY_FMT), array('inreplyto' => '[0-9]+')); + $m->connect('notice/new?replyto=:replyto', + array('action' => 'newnotice'), + array('replyto' => Nickname::DISPLAY_FMT)); + + $m->connect('notice/new', array('action' => 'newnotice')); + $m->connect('notice/:notice/file', array('action' => 'file'), array('notice' => '[0-9]+')); @@ -322,11 +246,13 @@ class Router $m->connect('notice/:notice', array('action' => 'shownotice'), array('notice' => '[0-9]+')); - $m->connect('notice/delete', array('action' => 'deletenotice')); + $m->connect('notice/delete/:notice', array('action' => 'deletenotice'), array('notice' => '[0-9]+')); + $m->connect('notice/delete', array('action' => 'deletenotice')); + $m->connect('bookmarklet/new', array('action' => 'bookmarklet')); // conversation @@ -348,10 +274,12 @@ class Router array('action' => 'userbyid'), array('id' => '[0-9]+')); - $m->connect('tags/', array('action' => 'publictagcloud')); - $m->connect('tag/', array('action' => 'publictagcloud')); - $m->connect('tags', array('action' => 'publictagcloud')); - $m->connect('tag', array('action' => 'publictagcloud')); + if (!common_config('performance', 'high')) { + $m->connect('tags/', array('action' => 'publictagcloud')); + $m->connect('tag/', array('action' => 'publictagcloud')); + $m->connect('tags', array('action' => 'publictagcloud')); + $m->connect('tag', array('action' => 'publictagcloud')); + } $m->connect('tag/:tag/rss', array('action' => 'tagrss'), array('tag' => self::REGEX_TAG)); @@ -420,17 +348,13 @@ class Router array('action' => 'ApiTimelinePublic', 'format' => '(xml|json|rss|atom|as)')); - $m->connect('api/statuses/friends_timeline.:format', - array('action' => 'ApiTimelineFriends', - 'format' => '(xml|json|rss|atom|as)')); - $m->connect('api/statuses/friends_timeline/:id.:format', array('action' => 'ApiTimelineFriends', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json|rss|atom|as)')); - $m->connect('api/statuses/home_timeline.:format', - array('action' => 'ApiTimelineHome', + $m->connect('api/statuses/friends_timeline.:format', + array('action' => 'ApiTimelineFriends', 'format' => '(xml|json|rss|atom|as)')); $m->connect('api/statuses/home_timeline/:id.:format', @@ -438,8 +362,8 @@ class Router 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json|rss|atom|as)')); - $m->connect('api/statuses/user_timeline.:format', - array('action' => 'ApiTimelineUser', + $m->connect('api/statuses/home_timeline.:format', + array('action' => 'ApiTimelineHome', 'format' => '(xml|json|rss|atom|as)')); $m->connect('api/statuses/user_timeline/:id.:format', @@ -447,8 +371,8 @@ class Router 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json|rss|atom|as)')); - $m->connect('api/statuses/mentions.:format', - array('action' => 'ApiTimelineMentions', + $m->connect('api/statuses/user_timeline.:format', + array('action' => 'ApiTimelineUser', 'format' => '(xml|json|rss|atom|as)')); $m->connect('api/statuses/mentions/:id.:format', @@ -456,7 +380,7 @@ class Router 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json|rss|atom|as)')); - $m->connect('api/statuses/replies.:format', + $m->connect('api/statuses/mentions.:format', array('action' => 'ApiTimelineMentions', 'format' => '(xml|json|rss|atom|as)')); @@ -465,6 +389,10 @@ class Router 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json|rss|atom|as)')); + $m->connect('api/statuses/replies.:format', + array('action' => 'ApiTimelineMentions', + 'format' => '(xml|json|rss|atom|as)')); + $m->connect('api/statuses/retweeted_by_me.:format', array('action' => 'ApiTimelineRetweetedByMe', 'format' => '(xml|json|atom|as)')); @@ -477,17 +405,13 @@ class Router array('action' => 'ApiTimelineRetweetsOfMe', 'format' => '(xml|json|atom|as)')); - $m->connect('api/statuses/friends.:format', - array('action' => 'ApiUserFriends', - 'format' => '(xml|json)')); - $m->connect('api/statuses/friends/:id.:format', array('action' => 'ApiUserFriends', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); - $m->connect('api/statuses/followers.:format', - array('action' => 'ApiUserFollowers', + $m->connect('api/statuses/friends.:format', + array('action' => 'ApiUserFriends', 'format' => '(xml|json)')); $m->connect('api/statuses/followers/:id.:format', @@ -495,26 +419,30 @@ class Router 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); - $m->connect('api/statuses/show.:format', - array('action' => 'ApiStatusesShow', - 'format' => '(xml|json|atom)')); + $m->connect('api/statuses/followers.:format', + array('action' => 'ApiUserFollowers', + 'format' => '(xml|json)')); $m->connect('api/statuses/show/:id.:format', array('action' => 'ApiStatusesShow', 'id' => '[0-9]+', 'format' => '(xml|json|atom)')); + $m->connect('api/statuses/show.:format', + array('action' => 'ApiStatusesShow', + 'format' => '(xml|json|atom)')); + $m->connect('api/statuses/update.:format', array('action' => 'ApiStatusesUpdate', 'format' => '(xml|json)')); - $m->connect('api/statuses/destroy.:format', + $m->connect('api/statuses/destroy/:id.:format', array('action' => 'ApiStatusesDestroy', + 'id' => '[0-9]+', 'format' => '(xml|json)')); - $m->connect('api/statuses/destroy/:id.:format', + $m->connect('api/statuses/destroy.:format', array('action' => 'ApiStatusesDestroy', - 'id' => '[0-9]+', 'format' => '(xml|json)')); $m->connect('api/statuses/retweet/:id.:format', @@ -529,13 +457,13 @@ class Router // users - $m->connect('api/users/show.:format', + $m->connect('api/users/show/:id.:format', array('action' => 'ApiUserShow', + 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); - $m->connect('api/users/show/:id.:format', + $m->connect('api/users/show.:format', array('action' => 'ApiUserShow', - 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); $m->connect('api/users/profile_image/:screen_name.:format', @@ -568,17 +496,13 @@ class Router array('action' => 'ApiFriendshipsExists', 'format' => '(xml|json)')); - $m->connect('api/friendships/create.:format', + $m->connect('api/friendships/create/:id.:format', array('action' => 'ApiFriendshipsCreate', + 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); - $m->connect('api/friendships/destroy.:format', - array('action' => 'ApiFriendshipsDestroy', - 'format' => '(xml|json)')); - - $m->connect('api/friendships/create/:id.:format', + $m->connect('api/friendships/create.:format', array('action' => 'ApiFriendshipsCreate', - 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); $m->connect('api/friendships/destroy/:id.:format', @@ -586,6 +510,10 @@ class Router 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); + $m->connect('api/friendships/destroy.:format', + array('action' => 'ApiFriendshipsDestroy', + 'format' => '(xml|json)')); + // Social graph $m->connect('api/friends/ids/:id.:format', @@ -628,13 +556,13 @@ class Router // favorites - $m->connect('api/favorites.:format', + $m->connect('api/favorites/:id.:format', array('action' => 'ApiTimelineFavorites', + 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json|rss|atom|as)')); - $m->connect('api/favorites/:id.:format', + $m->connect('api/favorites.:format', array('action' => 'ApiTimelineFavorites', - 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json|rss|atom|as)')); $m->connect('api/favorites/create/:id.:format', @@ -648,23 +576,24 @@ class Router 'format' => '(xml|json)')); // blocks - $m->connect('api/blocks/create.:format', - array('action' => 'ApiBlockCreate', - 'format' => '(xml|json)')); - $m->connect('api/blocks/create/:id.:format', array('action' => 'ApiBlockCreate', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); - $m->connect('api/blocks/destroy.:format', - array('action' => 'ApiBlockDestroy', + $m->connect('api/blocks/create.:format', + array('action' => 'ApiBlockCreate', 'format' => '(xml|json)')); $m->connect('api/blocks/destroy/:id.:format', array('action' => 'ApiBlockDestroy', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); + + $m->connect('api/blocks/destroy.:format', + array('action' => 'ApiBlockDestroy', + 'format' => '(xml|json)')); + // help $m->connect('api/help/test.:format', @@ -702,26 +631,21 @@ class Router 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json|rss|atom|as)')); - $m->connect('api/statusnet/groups/show.:format', - array('action' => 'ApiGroupShow', - 'format' => '(xml|json)')); - $m->connect('api/statusnet/groups/show/:id.:format', array('action' => 'ApiGroupShow', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); - $m->connect('api/statusnet/groups/join.:format', - array('action' => 'ApiGroupJoin', - 'id' => Nickname::INPUT_FMT, + $m->connect('api/statusnet/groups/show.:format', + array('action' => 'ApiGroupShow', 'format' => '(xml|json)')); $m->connect('api/statusnet/groups/join/:id.:format', array('action' => 'ApiGroupJoin', 'format' => '(xml|json)')); - $m->connect('api/statusnet/groups/leave.:format', - array('action' => 'ApiGroupLeave', + $m->connect('api/statusnet/groups/join.:format', + array('action' => 'ApiGroupJoin', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); @@ -729,30 +653,35 @@ class Router array('action' => 'ApiGroupLeave', 'format' => '(xml|json)')); + $m->connect('api/statusnet/groups/leave.:format', + array('action' => 'ApiGroupLeave', + 'id' => Nickname::INPUT_FMT, + 'format' => '(xml|json)')); + $m->connect('api/statusnet/groups/is_member.:format', array('action' => 'ApiGroupIsMember', 'format' => '(xml|json)')); - $m->connect('api/statusnet/groups/list.:format', + $m->connect('api/statusnet/groups/list/:id.:format', array('action' => 'ApiGroupList', + 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json|rss|atom)')); - $m->connect('api/statusnet/groups/list/:id.:format', + $m->connect('api/statusnet/groups/list.:format', array('action' => 'ApiGroupList', - 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json|rss|atom)')); $m->connect('api/statusnet/groups/list_all.:format', array('action' => 'ApiGroupListAll', 'format' => '(xml|json|rss|atom)')); - $m->connect('api/statusnet/groups/membership.:format', + $m->connect('api/statusnet/groups/membership/:id.:format', array('action' => 'ApiGroupMembership', + 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); - $m->connect('api/statusnet/groups/membership/:id.:format', + $m->connect('api/statusnet/groups/membership.:format', array('action' => 'ApiGroupMembership', - 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); $m->connect('api/statusnet/groups/create.:format', @@ -788,13 +717,9 @@ class Router array('action' => 'ApiListSubscriptions', 'user' => '[a-zA-Z0-9]+', 'format' => '(xml|json)')); - $m->connect('api/lists.:format', - array('action' => 'ApiLists', - 'format' => '(xml|json)')); - $m->connect('api/:user/lists.:format', + $m->connect('api/lists.:format', array('action' => 'ApiLists', - 'user' => '[a-zA-Z0-9]+', 'format' => '(xml|json)')); $m->connect('api/:user/lists/:id.:format', @@ -803,36 +728,41 @@ class Router 'id' => '[a-zA-Z0-9]+', 'format' => '(xml|json)')); + $m->connect('api/:user/lists.:format', + array('action' => 'ApiLists', + 'user' => '[a-zA-Z0-9]+', + 'format' => '(xml|json)')); + $m->connect('api/:user/lists/:id/statuses.:format', array('action' => 'ApiTimelineList', 'user' => '[a-zA-Z0-9]+', 'id' => '[a-zA-Z0-9]+', 'format' => '(xml|json|rss|atom)')); - $m->connect('api/:user/:list_id/members.:format', - array('action' => 'ApiListMembers', + $m->connect('api/:user/:list_id/members/:id.:format', + array('action' => 'ApiListMember', 'user' => '[a-zA-Z0-9]+', 'list_id' => '[a-zA-Z0-9]+', + 'id' => '[a-zA-Z0-9]+', 'format' => '(xml|json)')); - $m->connect('api/:user/:list_id/subscribers.:format', - array('action' => 'ApiListSubscribers', + $m->connect('api/:user/:list_id/members.:format', + array('action' => 'ApiListMembers', 'user' => '[a-zA-Z0-9]+', 'list_id' => '[a-zA-Z0-9]+', 'format' => '(xml|json)')); - $m->connect('api/:user/:list_id/members/:id.:format', - array('action' => 'ApiListMember', + $m->connect('api/:user/:list_id/subscribers/:id.:format', + array('action' => 'ApiListSubscriber', 'user' => '[a-zA-Z0-9]+', 'list_id' => '[a-zA-Z0-9]+', 'id' => '[a-zA-Z0-9]+', 'format' => '(xml|json)')); - $m->connect('api/:user/:list_id/subscribers/:id.:format', - array('action' => 'ApiListSubscriber', + $m->connect('api/:user/:list_id/subscribers.:format', + array('action' => 'ApiListSubscribers', 'user' => '[a-zA-Z0-9]+', 'list_id' => '[a-zA-Z0-9]+', - 'id' => '[a-zA-Z0-9]+', 'format' => '(xml|json)')); // Tags @@ -970,7 +900,9 @@ class Router // people tags - $m->connect('peopletags', array('action' => 'publicpeopletagcloud')); + if (!common_config('performance', 'high')) { + $m->connect('peopletags', array('action' => 'publicpeopletagcloud')); + } $m->connect('peopletag/:tag', array('action' => 'peopletag', 'tag' => self::REGEX_TAG)); @@ -1139,7 +1071,7 @@ class Router { try { $match = $this->m->match($path); - } catch (Net_URL_Mapper_InvalidException $e) { + } catch (Exception $e) { common_log(LOG_ERR, "Problem getting route for $path - " . $e->getMessage()); // TRANS: Client error on action trying to visit a non-existing page. @@ -1161,7 +1093,6 @@ class Router } $url = $this->m->generate($args, $params, $fragment); - // Due to a bug in the Net_URL_Mapper code, the returned URL may // contain a malformed query of the form ?p1=v1?p2=v2?p3=v3. We // repair that here rather than modifying the upstream code...