[BUGFIX] Allow PSR-7 Uris to allow no port at all 28/56428/2
authorBenni Mack <benni@typo3.org>
Wed, 21 Mar 2018 21:23:47 +0000 (22:23 +0100)
committerGeorg Ringer <georg.ringer@gmail.com>
Thu, 22 Mar 2018 14:59:32 +0000 (15:59 +0100)
In order to set a PSR-7 based uri to the default port
the specs allow to set $uri->withPort(null) but our
tests and implementation restrict that.

Resolves: #84518
Releases: master, 8.7
Change-Id: Ic2c3d70fca35a767c7ed9d324eb93b30c66bbd3e
Reviewed-on: https://review.typo3.org/56428
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Georg Ringer <georg.ringer@gmail.com>
Tested-by: Georg Ringer <georg.ringer@gmail.com>
typo3/sysext/core/Classes/Http/Uri.php
typo3/sysext/core/Tests/Unit/Http/UriTest.php

index 6a912ab..d4b8d3f 100644 (file)
@@ -434,14 +434,16 @@ class Uri implements UriInterface
      */
     public function withPort($port)
     {
-        if (\TYPO3\CMS\Core\Utility\MathUtility::canBeInterpretedAsInteger($port) === false) {
-            $argumentType = is_object($port) ? get_class($port) : gettype($port);
-            throw new \InvalidArgumentException('Invalid port "' . $argumentType . '" specified, must be an integer.', 1436717324);
-        }
+        if ($port !== null) {
+            if (\TYPO3\CMS\Core\Utility\MathUtility::canBeInterpretedAsInteger($port) === false) {
+                $argumentType = is_object($port) ? get_class($port) : gettype($port);
+                throw new \InvalidArgumentException('Invalid port "' . $argumentType . '" specified, must be an integer.', 1436717324);
+            }
 
-        $port = (int)$port;
-        if ($port < 1 || $port > 65535) {
-            throw new \InvalidArgumentException('Invalid port "' . $port . '" specified, must be a valid TCP/UDP port.', 1436717326);
+            $port = (int)$port;
+            if ($port < 1 || $port > 65535) {
+                throw new \InvalidArgumentException('Invalid port "' . $port . '" specified, must be a valid TCP/UDP port.', 1436717326);
+            }
         }
 
         $clonedObject = clone $this;
index 85dd41b..fb26993 100644 (file)
@@ -98,6 +98,18 @@ class UriTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase
     }
 
     /**
+     * @test
+     */
+    public function withPortAndNullValueReturnsInstanceWithProvidedPort()
+    {
+        $uri = new Uri('https://user:pass@local.example.com:3001/foo?bar=baz#quz');
+        $new = $uri->withPort(null);
+        $this->assertEquals(
+            'https://user:pass@local.example.com/foo?bar=baz#quz',
+            (string) $new
+        );
+    }
+    /**
      * @return array
      */
     public function validPortsDataProvider()
@@ -130,7 +142,6 @@ class UriTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase
     public function invalidPortsDataProviderType()
     {
         return [
-            'null'      => [null],
             'false'     => [false],
             'string'    => ['string'],
             'array'     => [[3000]],