From 053ee7b3860c352004bede82d040b4bd34ecb072 Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Mon, 21 Jan 2019 12:02:30 +0100 Subject: [PATCH] Only load routes of the app which is requested * Add fallback to load all routes if needed * Move partial loaded routes test to proper place Signed-off-by: Morris Jobke --- lib/private/Route/Router.php | 24 ++++++++++++---- tests/lib/Route/RouterTest.php | 52 ++++++++++++++++++++++++++++++++++ tests/lib/UrlGeneratorTest.php | 4 ++- 3 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 tests/lib/Route/RouterTest.php diff --git a/lib/private/Route/Router.php b/lib/private/Route/Router.php index 6de581ffa96..ec91e08472c 100644 --- a/lib/private/Route/Router.php +++ b/lib/private/Route/Router.php @@ -346,13 +346,27 @@ class Router implements IRouter { public function generate($name, $parameters = [], $absolute = false) { + $referenceType = UrlGenerator::ABSOLUTE_URL; + if ($absolute === false) { + $referenceType = UrlGenerator::ABSOLUTE_PATH; + } + $name = $this->fixLegacyRootName($name); + if (strpos($name, '.') !== false) { + list($appName, $other) = explode('.', $name, 3); + // OCS routes are prefixed with "ocs." + if ($appName === 'ocs') { + $appName = $other; + } + $this->loadRoutes($appName); + try { + return $this->getGenerator()->generate($name, $parameters, $referenceType); + } catch (RouteNotFoundException $e) { + } + } + + // Fallback load all routes $this->loadRoutes(); try { - $referenceType = UrlGenerator::ABSOLUTE_URL; - if ($absolute === false) { - $referenceType = UrlGenerator::ABSOLUTE_PATH; - } - $name = $this->fixLegacyRootName($name); return $this->getGenerator()->generate($name, $parameters, $referenceType); } catch (RouteNotFoundException $e) { $this->logger->logException($e, ['level' => ILogger::INFO]); diff --git a/tests/lib/Route/RouterTest.php b/tests/lib/Route/RouterTest.php new file mode 100644 index 00000000000..4fcd9d65cd1 --- /dev/null +++ b/tests/lib/Route/RouterTest.php @@ -0,0 +1,52 @@ + + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace Test\Route; + +use OC\Route\Router; +use OCP\ILogger; +use Test\TestCase; + +/** + * Class RouterTest + * + * @package Test\Route + */ +class RouterTest extends TestCase { + public function testGenerateConsecutively(): void { + /** @var ILogger $logger */ + $logger = $this->createMock(ILogger::class); + $router = new Router($logger); + + $this->assertEquals('/index.php/apps/files/', $router->generate('files.view.index')); + + // the OCS route is the prefixed one for the AppFramework - see /ocs/v1.php for routing details + $this->assertEquals('/index.php/ocsapp/apps/dav/api/v1/direct', $router->generate('ocs.dav.direct.getUrl')); + + // special route name - should load all apps and then find the route + $this->assertEquals('/index.php/apps/files/ajax/list.php', $router->generate('files_ajax_list')); + + // test caching + $this->assertEquals('/index.php/apps/files/', $router->generate('files.view.index')); + } +} diff --git a/tests/lib/UrlGeneratorTest.php b/tests/lib/UrlGeneratorTest.php index 46508a217d8..5043dfb7a52 100644 --- a/tests/lib/UrlGeneratorTest.php +++ b/tests/lib/UrlGeneratorTest.php @@ -15,6 +15,8 @@ use OCP\IURLGenerator; /** * Class UrlGeneratorTest + * + * @package Test */ class UrlGeneratorTest extends \Test\TestCase { @@ -90,8 +92,8 @@ class UrlGeneratorTest extends \Test\TestCase { public function provideRoutes() { return [ - ['files_ajax_list', 'http://localhost/nextcloud/index.php/apps/files/ajax/list.php'], ['core.Preview.getPreview', 'http://localhost/nextcloud/index.php/core/preview.png'], + ['cloud_federation_api.requesthandlercontroller.addShare', 'http://localhost/nextcloud/index.php/ocm/shares'], ]; } -- 2.39.5