From 73da958ed1979459218a4fe833bd5480b77c87ab Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 14 Feb 2023 11:47:00 +0900 Subject: [PATCH 1/4] fix: URI::getSegment() may return non-existent segment without Exception --- system/HTTP/URI.php | 12 ++++++++---- tests/system/HTTP/URITest.php | 25 +++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/system/HTTP/URI.php b/system/HTTP/URI.php index 587e441ffc17..2be84a684a64 100644 --- a/system/HTTP/URI.php +++ b/system/HTTP/URI.php @@ -537,18 +537,22 @@ public function getSegments(): array * @param string $default Default value * * @return string The value of the segment. If no segment is found, - * throws InvalidArgumentError + * throws HTTPException */ public function getSegment(int $number, string $default = ''): string { - // The segment should treat the array as 1-based for the user - // but we still have to deal with a zero-based array. - $number--; + if ($number < 1) { + throw HTTPException::forURISegmentOutOfRange($number); + } if ($number > count($this->segments) && ! $this->silent) { throw HTTPException::forURISegmentOutOfRange($number); } + // The segment should treat the array as 1-based for the user + // but we still have to deal with a zero-based array. + $number--; + return $this->segments[$number] ?? $default; } diff --git a/tests/system/HTTP/URITest.php b/tests/system/HTTP/URITest.php index 14de6e3d587b..5ef3810b2531 100644 --- a/tests/system/HTTP/URITest.php +++ b/tests/system/HTTP/URITest.php @@ -62,7 +62,6 @@ public function testSegmentsIsPopulatedRightForMultipleSegments() $this->assertSame('path', $uri->getSegment(1)); $this->assertSame('to', $uri->getSegment(2)); $this->assertSame('script', $uri->getSegment(3)); - $this->assertSame('', $uri->getSegment(4)); $this->assertSame(3, $uri->getTotalSegments()); } @@ -70,22 +69,43 @@ public function testSegmentsIsPopulatedRightForMultipleSegments() public function testSegmentOutOfRange() { $this->expectException(HTTPException::class); + $uri = new URI('http://hostname/path/to/script'); - $uri->getSegment(5); + $uri->getSegment(4); + } + + public function testSegmentOutOfRangeZero() + { + $this->expectException(HTTPException::class); + + $uri = new URI('http://hostname/path/to/script'); + $uri->getSegment(0); + } + + public function testSegmentOutOfRangeNegative() + { + $this->expectException(HTTPException::class); + + $uri = new URI('http://hostname/path/to/script'); + $uri->getSegment(-1); } public function testSegmentOutOfRangeWithSilent() { $url = 'http://abc.com/a123/b/c'; $uri = new URI($url); + + $this->assertSame('', $uri->setSilent()->getSegment(4)); $this->assertSame('', $uri->setSilent()->getSegment(22)); } public function testSegmentOutOfRangeWithDefaultValue() { $this->expectException(HTTPException::class); + $url = 'http://abc.com/a123/b/c'; $uri = new URI($url); + $uri->getSegment(22, 'something'); } @@ -93,6 +113,7 @@ public function testSegmentOutOfRangeWithSilentAndDefaultValue() { $url = 'http://abc.com/a123/b/c'; $uri = new URI($url); + $this->assertSame('something', $uri->setSilent()->getSegment(22, 'something')); } From 6b25d31a2c45bb2e0566c314b94adf70d1021a4d Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 14 Feb 2023 11:48:49 +0900 Subject: [PATCH 2/4] test: fix setup --- tests/system/Pager/PagerTest.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/system/Pager/PagerTest.php b/tests/system/Pager/PagerTest.php index 1c3861748b34..4c151c8ffba8 100644 --- a/tests/system/Pager/PagerTest.php +++ b/tests/system/Pager/PagerTest.php @@ -168,6 +168,8 @@ public function testStoreWithQueries() public function testStoreWithSegments() { + $this->createPager('/3?page=3&foo=bar'); + $_GET['page'] = 3; $_GET['foo'] = 'bar'; From 4cebcd76a59c888a1129860095c9d6bb197424b1 Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 14 Feb 2023 11:58:17 +0900 Subject: [PATCH 3/4] docs: update URI page --- user_guide_src/source/libraries/uri/024.php | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/user_guide_src/source/libraries/uri/024.php b/user_guide_src/source/libraries/uri/024.php index 61a951db93c3..3f4bb697d59a 100644 --- a/user_guide_src/source/libraries/uri/024.php +++ b/user_guide_src/source/libraries/uri/024.php @@ -2,13 +2,17 @@ // URI = http://example.com/users/15/profile +echo $uri->getSegment(1, 'foo'); +// will print 'users' + +echo $uri->getSegment(3, 'bar'); // will print 'profile' -echo $uri->getSegment(3, 'foo'); -// will print 'bar' -echo $uri->getSegment(4, 'bar'); + +echo $uri->getSegment(4, 'baz'); // will throw an exception -echo $uri->getSegment(5, 'baz'); + +echo $uri->setSilent()->getSegment(4, 'baz'); // will print 'baz' -echo $uri->setSilent()->getSegment(5, 'baz'); + +echo $uri->setSilent()->getSegment(4); // will print '' (empty string) -echo $uri->setSilent()->getSegment(5); From 17910c8c5a5a9185fda5a389f124d3e80da32576 Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 14 Feb 2023 12:50:49 +0900 Subject: [PATCH 4/4] docs: add changelog and upgrading guide --- user_guide_src/source/changelogs/v4.4.0.rst | 7 +++++++ user_guide_src/source/installation/upgrade_440.rst | 12 ++++++++++++ .../source/installation/upgrade_440/001.php | 5 +++++ 3 files changed, 24 insertions(+) create mode 100644 user_guide_src/source/installation/upgrade_440/001.php diff --git a/user_guide_src/source/changelogs/v4.4.0.rst b/user_guide_src/source/changelogs/v4.4.0.rst index 965a0efbc057..ba962d2e036c 100644 --- a/user_guide_src/source/changelogs/v4.4.0.rst +++ b/user_guide_src/source/changelogs/v4.4.0.rst @@ -20,6 +20,13 @@ BREAKING Behavior Changes ================ +URI::getSegment() and Non-Existent Segment +------------------------------------------ + +An exception is now thrown whenever a non-existent segment number is passed. +In previous versions, an exception was not thrown if the last segment ``+1`` was +specified. + Interface Changes ================= diff --git a/user_guide_src/source/installation/upgrade_440.rst b/user_guide_src/source/installation/upgrade_440.rst index 16995c1d897e..dbf8e6c1a9aa 100644 --- a/user_guide_src/source/installation/upgrade_440.rst +++ b/user_guide_src/source/installation/upgrade_440.rst @@ -15,6 +15,18 @@ Please refer to the upgrade instructions corresponding to your installation meth Breaking Changes **************** +URI::getSegment() Change +======================== + +Dut to a bug, in previous versions an exception was not thrown if the last segment +``+1`` was specified. This bug has been fixed. If the non-existent segment is +specified, an exception is always thrown. + +If your code depends on this bug, add ``->setSilent()`` before the call. + +.. literalinclude:: upgrade_440/001.php + :lines: 2- + Mandatory File Changes ********************** diff --git a/user_guide_src/source/installation/upgrade_440/001.php b/user_guide_src/source/installation/upgrade_440/001.php new file mode 100644 index 000000000000..79167adcabcf --- /dev/null +++ b/user_guide_src/source/installation/upgrade_440/001.php @@ -0,0 +1,5 @@ +getSegment(2); +// ↓ +$uri->setSilent()->getSegment(2);