From a0c0d154ee0c7b69ebbfdd0b22f4ee9c5e85c62d Mon Sep 17 00:00:00 2001 From: TowyTowy Date: Sun, 12 Jul 2026 23:02:26 +0200 Subject: [PATCH] fix: handle YOURLS 200 response without shorturl gracefully When YOURLS replies with statusCode 200 but no "shorturl" field, YourlsProxy::_extractShortUrl() returned int 0 for its ?string return type. Under the file's declare(strict_types=1) this raises an uncaught TypeError, aborting paste creation instead of surfacing the intended "Error parsing proxy response" message. Fall back to null (matching ShlinkProxy) so the existing graceful error path is taken. Co-Authored-By: Claude --- CHANGELOG.md | 1 + lib/Proxy/YourlsProxy.php | 2 +- tst/YourlsProxyTest.php | 12 ++++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7810631..543bc6c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # PrivateBin version history ## 2.0.6 (not yet released) +* FIXED: Gracefully handle YOURLS replies with a 200 status code but no shorturl, instead of raising a TypeError ## 2.0.5 (2026-07-11) * CHANGED: Show OS-specific copy hotkey hint (Cmd+c on Mac, Ctrl+c on others) (#1506) diff --git a/lib/Proxy/YourlsProxy.php b/lib/Proxy/YourlsProxy.php index 76bd1c15..6fb9b0d3 100644 --- a/lib/Proxy/YourlsProxy.php +++ b/lib/Proxy/YourlsProxy.php @@ -66,7 +66,7 @@ class YourlsProxy extends AbstractProxy protected function _extractShortUrl(array $data): ?string { if ((int) ($data['statusCode'] ?? 0) === 200) { - return $data['shorturl'] ?? 0; + return $data['shorturl'] ?? null; } return null; } diff --git a/tst/YourlsProxyTest.php b/tst/YourlsProxyTest.php index 05b0b91e..fffc2e39 100644 --- a/tst/YourlsProxyTest.php +++ b/tst/YourlsProxyTest.php @@ -135,6 +135,18 @@ class YourlsProxyTest extends TestCase $this->assertEquals($yourls->getError(), 'Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.'); } + public function testYourlsSuccessWithoutShortUrl() + { + // YOURLS may reply with statusCode 200 but without a shorturl field; + // this must be handled gracefully as an error instead of raising a + // TypeError (the method is declared to return ?string) + file_put_contents($this->_mock_yourls_service, '{"statusCode":200}'); + + $yourls = new YourlsProxy($this->_conf, 'https://example.com/?foo#bar'); + $this->assertTrue($yourls->isError()); + $this->assertEquals($yourls->getError(), 'Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.'); + } + public function testServerError() { // simulate some other server error that results in a non-JSON reply