Skip to content

Commit

Permalink
First attempt to check against core routes before loading all app routes
Browse files Browse the repository at this point in the history
Most of the time we will find a matching route in either the loaded ones
matched on the URL or in the core ones. Therfore we can attempt to try
those first and only load all app routes if no match was found by the
Symfony URLMatcher.

Signed-off-by: Julius Härtl <jus@bitgrid.net>
  • Loading branch information
juliushaertl committed Dec 14, 2020
1 parent 99a6665 commit ea69a14
Showing 1 changed file with 14 additions and 12 deletions.
26 changes: 14 additions & 12 deletions lib/private/Route/Router.php
Original file line number Diff line number Diff line change
Expand Up @@ -234,32 +234,29 @@ public function create($name,
* @throws \Exception
* @return array
*/
public function findMatchingRoute(string $url): array {
if (substr($url, 0, 6) === '/apps/') {
public function findMatchingRoute(string $url, bool $loadAll = false): array {
if (strpos($url, '/apps/') === 0) {
// empty string / 'apps' / $app / rest of the route
list(, , $app,) = explode('/', $url, 4);

$app = \OC_App::cleanAppId($app);
\OC::$REQUESTEDAPP = $app;
$this->loadRoutes($app);
} elseif (substr($url, 0, 13) === '/ocsapp/apps/') {
} elseif (strpos($url, '/ocsapp/apps/') === 0) {
// empty string / 'ocsapp' / 'apps' / $app / rest of the route
list(, , , $app,) = explode('/', $url, 5);

$app = \OC_App::cleanAppId($app);
\OC::$REQUESTEDAPP = $app;
$this->loadRoutes($app);
} elseif (substr($url, 0, 10) === '/settings/') {
} elseif (strpos($url, '/settings/') === 0) {
$this->loadRoutes('settings');
} elseif (substr($url, 0, 6) === '/core/') {
\OC::$REQUESTEDAPP = $url;
if (!\OC::$server->getConfig()->getSystemValueBool('maintenance') && !Util::needUpgrade()) {
\OC_App::loadApps();
}
$this->loadRoutes('core');
} else {
$this->loadRoutes();
}
\OC::$REQUESTEDAPP = $url;
if (!\OC::$server->getConfig()->getSystemValueBool('maintenance') && !Util::needUpgrade()) {
\OC_App::loadApps();
}
$this->loadRoutes('core');

$matcher = new UrlMatcher($this->root, $this->context);
try {
Expand All @@ -272,6 +269,11 @@ public function findMatchingRoute(string $url): array {
try {
$parameters = $matcher->match($url . '/');
} catch (ResourceNotFoundException $newException) {
// Attempt to fallback to load all routes if none of the above route patterns matches and the route is not in core
if (!$loadAll) {
$this->loadRoutes();
return $this->findMatchingRoute($url, true);
}
// If we still didn't match a route, we throw the original exception
throw $e;
}
Expand Down

0 comments on commit ea69a14

Please sign in to comment.