]> git.mxchange.org Git - friendica.git/commitdiff
Add UriInterface-enabled cleanUri method in Model\GServer
authorHypolite Petovan <hypolite@mrpetovan.com>
Wed, 4 Jan 2023 16:38:08 +0000 (11:38 -0500)
committerHypolite Petovan <hypolite@mrpetovan.com>
Fri, 13 Jan 2023 14:20:09 +0000 (09:20 -0500)
- Tests!

src/Model/GServer.php
tests/src/Model/GServerTest.php [new file with mode: 0644]

index 2fc37f35c36396b7e9fbe5601f3df42e0e8a4f24..14fe2011b39287a37945757c10aaf472d03f0442 100644 (file)
@@ -45,6 +45,7 @@ use Friendica\Util\Strings;
 use Friendica\Util\XML;
 use Friendica\Network\HTTPException;
 use GuzzleHttp\Psr7\Uri;
+use Psr\Http\Message\UriInterface;
 
 /**
  * This class handles GServer related functions
@@ -334,18 +335,41 @@ class GServer
         *
         * @return string cleaned URL
         * @throws Exception
+        * @deprecated since 2023.03 Use cleanUri instead
         */
        public static function cleanURL(string $dirtyUrl): string
        {
                try {
-                       $url = str_replace('/index.php', '', trim($dirtyUrl, '/'));
-                       return (string)(new Uri($url))->withUserInfo('')->withQuery('')->withFragment('');
+                       return (string)self::cleanUri(new Uri($dirtyUrl));
                } catch (\Throwable $e) {
-                       Logger::warning('Invalid URL', ['dirtyUrl' => $dirtyUrl, 'url' => $url]);
+                       Logger::warning('Invalid URL', ['dirtyUrl' => $dirtyUrl]);
                        return '';
                }
        }
 
+       /**
+        * Remove unwanted content from the given URI
+        *
+        * @param UriInterface $dirtyUri
+        *
+        * @return UriInterface cleaned URI
+        * @throws Exception
+        */
+       public static function cleanUri(UriInterface $dirtyUri): string
+       {
+               return $dirtyUri
+                       ->withUserInfo('')
+                       ->withQuery('')
+                       ->withFragment('')
+                       ->withPath(
+                               preg_replace(
+                                       '#(?:^|/)index\.php#',
+                                       '',
+                                       rtrim($dirtyUri->getPath(), '/')
+                               )
+                       );
+       }
+
        /**
         * Detect server data (type, protocol, version number, ...)
         * The detected data is then updated or inserted in the gserver table.
diff --git a/tests/src/Model/GServerTest.php b/tests/src/Model/GServerTest.php
new file mode 100644 (file)
index 0000000..a56f4ed
--- /dev/null
@@ -0,0 +1,76 @@
+<?php
+/**
+ * @copyright Copyright (C) 2010-2023, the Friendica project
+ *
+ * @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 <https://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace Friendica\Test\src\Model;
+
+use Friendica\Model\GServer;
+use GuzzleHttp\Psr7\Uri;
+use Psr\Http\Message\UriInterface;
+
+class GServerTest extends \PHPUnit\Framework\TestCase
+{
+       public function dataCleanUri(): array
+       {
+               return [
+                       'full-monty' => [
+                               'expected' => new Uri('https://example.com/path'),
+                               'dirtyUri' => new Uri('https://user:password@example.com/path?query=string#fragment'),
+                       ],
+                       'index.php' => [
+                               'expected' => new Uri('https://example.com'),
+                               'dirtyUri' => new Uri('https://example.com/index.php'),
+                       ],
+                       'index.php-2' => [
+                               'expected' => new Uri('https://example.com/path/to/resource'),
+                               'dirtyUri' => new Uri('https://example.com/index.php/path/to/resource'),
+                       ],
+                       'index.php-path' => [
+                               'expected' => new Uri('https://example.com/path/to'),
+                               'dirtyUri' => new Uri('https://example.com/path/to/index.php'),
+                       ],
+                       'index.php-path-2' => [
+                               'expected' => new Uri('https://example.com/path/to/path/to/resource'),
+                               'dirtyUri' => new Uri('https://example.com/path/to/index.php/path/to/resource'),
+                       ],
+                       'index.php-slash' => [
+                               'expected' => new Uri('https://example.com'),
+                               'dirtyUri' => new Uri('https://example.com/index.php/'),
+                       ],
+                       'index.php-slash-2' => [
+                               'expected' => new Uri('https://example.com/path/to/resource'),
+                               'dirtyUri' => new Uri('https://example.com/index.php/path/to/resource/'),
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider dataCleanUri
+        *
+        * @param UriInterface $expected
+        * @param UriInterface $dirtyUri
+        * @return void
+        * @throws \Exception
+        */
+       public function testCleanUri(UriInterface $expected, UriInterface $dirtyUri)
+       {
+               $this->assertEquals($expected, GServer::cleanUri($dirtyUri));
+       }
+}