diff --git a/app/Models/Feed.php b/app/Models/Feed.php index 06a72ec12..99895ab79 100644 --- a/app/Models/Feed.php +++ b/app/Models/Feed.php @@ -105,9 +105,15 @@ class FreshRSS_Feed extends Minz_Model { $this->hashFavicon(skipCache: true); } + /** Must match the proxy of `FreshRSS_SimplePieCustom`, which stores `Retry-After`. */ public function proxyParam(): string { - $curl_params = FreshRSS_http_Util::sanitizeCurlParams($this->attributeArray('curl_params') ?? []); - return is_string($curl_params[CURLOPT_PROXY] ?? null) ? $curl_params[CURLOPT_PROXY] : ''; + $curl_options = array_replace(FreshRSS_Context::systemConf()->curl_options, + FreshRSS_http_Util::sanitizeCurlParams($this->attributeArray('curl_params') ?? [])); + $proxyType = $curl_options[CURLOPT_PROXYTYPE] ?? 0; + if (is_int($proxyType) && ($proxyType < 0 || $proxyType === 3)) { // 3 is legacy for NONE + return ''; // Proxy disabled for this feed + } + return is_string($curl_options[CURLOPT_PROXY] ?? null) ? $curl_options[CURLOPT_PROXY] : ''; } /** diff --git a/tests/app/Models/FeedTest.php b/tests/app/Models/FeedTest.php index 9668fd304..7ebf86930 100644 --- a/tests/app/Models/FeedTest.php +++ b/tests/app/Models/FeedTest.php @@ -5,10 +5,23 @@ use PHPUnit\Framework\Attributes\DataProvider; final class FeedTest extends \PHPUnit\Framework\TestCase { + #[\Override] + protected function setUp(): void { + FreshRSS_Context::initSystem(reload: true); + } + + #[\Override] + protected function tearDown(): void { + FreshRSS_Context::initSystem(reload: true); // Restore the default curl_options + } + #[DataProvider('provideStoredAndRequestedUrls')] - public function test_load_obeysRetryAfter(string $storedUrl, string $requestedUrl): void { + public function test_load_obeysRetryAfter(string $storedUrl, string $requestedUrl, string $systemProxy = ''): void { + if ($systemProxy !== '') { + FreshRSS_Context::systemConf()->_attribute('curl_options', [CURLOPT_PROXY => $systemProxy]); + } $getRetryAfterFile = new ReflectionMethod(FreshRSS_http_Util::class, 'getRetryAfterFile'); - $file = $getRetryAfterFile->invoke(null, $requestedUrl, ''); + $file = $getRetryAfterFile->invoke(null, $requestedUrl, $systemProxy); self::assertIsString($file); self::assertTrue(touch($file, time() + 600)); try { @@ -21,12 +34,13 @@ final class FeedTest extends \PHPUnit\Framework\TestCase { } } - /** @return array */ + /** @return array */ public static function provideStoredAndRequestedUrls(): array { // On a local network, where Retry-After is per URL return [ 'HTML-encoded' => ['http://192.168.1.2/?action=display&bridge=Example', 'http://192.168.1.2/?action=display&bridge=Example'], 'force_feed' => ['http://192.168.1.2/feed#force_feed', 'http://192.168.1.2/feed'], + 'system proxy' => ['http://192.168.1.2/feed', 'http://192.168.1.2/feed', 'proxy.example.test:3128'], ]; } }