diff --git a/CHANGELOG.md b/CHANGELOG.md index 346a87e472..2f05810072 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ The format is mostly based on [Keep a Changelog](https://keepachangelog.com/en/1 ### Changed - Drop support for Nextcloud 25, Supported: 26, 27 (#2316) - Add a new command for occ `./occ news:updater:job` allows to check and reset the update job (#2166) +- Check for available http(s) compression options and use them (gzip, deflate, brotli) (#2328) ### Fixed # Releases diff --git a/lib/Config/FetcherConfig.php b/lib/Config/FetcherConfig.php index 6c52e299cd..582594e250 100644 --- a/lib/Config/FetcherConfig.php +++ b/lib/Config/FetcherConfig.php @@ -96,28 +96,24 @@ public function __construct(IConfig $config) /** * Checks for available encoding options - * + * * @return String list of supported encoding types */ - private function checkEncoding() + public function checkEncoding() { $supportedEncoding = []; - $curl_version = curl_version(); + // check curl features + $curl_features = curl_version()["features"]; - $bitfields = Array( - 'CURL_VERSION_LIBZ' => ['gzip', 'deflate'], - 'CURL_VERSION_BROTLI' => ['br'] - ); + $bitfields = array('CURL_VERSION_LIBZ' => ['gzip', 'deflate'], 'CURL_VERSION_BROTLI' => ['br']); - foreach ($bitfields as $feature => $header) - { + foreach ($bitfields as $feature => $header) { // checking available features via the 'features' bitmask and adding available types to the list - $curl_version['features'] & constant($feature) ? $supportedEncoding = array_merge($supportedEncoding, $header) : null; - + $curl_features & constant($feature) ? + $supportedEncoding = array_merge($supportedEncoding, $header) : null; } return implode(", ", $supportedEncoding); - } /** diff --git a/lib/Fetcher/FeedFetcher.php b/lib/Fetcher/FeedFetcher.php index 9fdee1d976..6e211a6407 100755 --- a/lib/Fetcher/FeedFetcher.php +++ b/lib/Fetcher/FeedFetcher.php @@ -26,6 +26,7 @@ use Net_URL2; use OCP\IL10N; use OCP\ITempManager; +use OCP\IConfig; use OCA\News\Db\Item; use OCA\News\Db\Feed; @@ -73,6 +74,11 @@ class FeedFetcher implements IFeedFetcher */ private $logger; + /** + * @var IConfig + */ + private $iConfig; + public function __construct( FeedIo $fetcher, Favicon $favicon, @@ -80,7 +86,8 @@ public function __construct( IL10N $l10n, ITempManager $ITempManager, Time $time, - LoggerInterface $logger + LoggerInterface $logger, + IConfig $iConfig ) { $this->reader = $fetcher; $this->faviconFactory = $favicon; @@ -89,6 +96,7 @@ public function __construct( $this->ITempManager = $ITempManager; $this->time = $time; $this->logger = $logger; + $this->iConfig = $iConfig; } @@ -401,6 +409,7 @@ protected function getFavicon(FeedInterface $feed, string $url): ?string try { // Base_uri can only be set on creation, will be used when link is relative. $client = new Client(['base_uri' => $base_url]); + $fetcherConfig = new FetcherConfig($this->iConfig); $response = $client->request( 'GET', $favicon, @@ -409,7 +418,8 @@ protected function getFavicon(FeedInterface $feed, string $url): ?string 'headers' => [ 'User-Agent' => FetcherConfig::DEFAULT_USER_AGENT, 'Accept' => 'image/*', - 'If-Modified-Since' => date(DateTime::RFC7231, $last_modified) + 'If-Modified-Since' => date(DateTime::RFC7231, $last_modified), + 'Accept-Encoding' => $fetcherConfig->checkEncoding() ] ] ); diff --git a/tests/Unit/Fetcher/FeedFetcherTest.php b/tests/Unit/Fetcher/FeedFetcherTest.php index 1814a82711..7dd8562b8d 100644 --- a/tests/Unit/Fetcher/FeedFetcherTest.php +++ b/tests/Unit/Fetcher/FeedFetcherTest.php @@ -33,6 +33,7 @@ use OCA\News\Utility\Time; use OCP\IL10N; use OCP\ITempManager; +use OCP\IConfig; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; @@ -108,9 +109,9 @@ class FeedFetcherTest extends TestCase private $scraper; /** - * @var MockObject|Client + * @var MockObject|iConfig */ - private $client; + private $iConfig; //metadata /** @@ -194,7 +195,7 @@ protected function setUp(): void $this->scraper = $this->getMockBuilder(Scraper::class) ->disableOriginalConstructor() ->getMock(); - $this->client = $this->getMockBuilder(Client::class) + $this->iConfig = $this->getMockBuilder(IConfig::class) ->disableOriginalConstructor() ->getMock(); $this->fetcher = new FeedFetcher( @@ -205,7 +206,7 @@ protected function setUp(): void $this->ITempManager, $timeFactory, $this->logger, - $this->client + $this->iConfig ); $this->url = 'http://tests/';