From dc8b8301d387d48e38624423cba9cf5323f26291 Mon Sep 17 00:00:00 2001 From: Bernhard Posselt Date: Wed, 22 Oct 2014 11:06:43 +0200 Subject: fix #302 --- appinfo/database.xml | 10 ++++++++++ appinfo/info.xml | 2 +- db/feed.php | 8 ++++++++ fetcher/feedfetcher.php | 21 +++++++++++++++++---- fetcher/fetcher.php | 11 +++++++++-- fetcher/ifeedfetcher.php | 8 +++++++- tests/unit/db/FeedTest.php | 4 ++++ tests/unit/fetcher/FeedFetcherTest.php | 9 +++++++++ 8 files changed, 65 insertions(+), 8 deletions(-) diff --git a/appinfo/database.xml b/appinfo/database.xml index 12b1ba4f9..3ee6a5261 100644 --- a/appinfo/database.xml +++ b/appinfo/database.xml @@ -110,6 +110,16 @@ clob false + + last_modified + clob + false + + + etag + clob + false + added integer diff --git a/appinfo/info.xml b/appinfo/info.xml index 91e51ad96..83651bb04 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -4,7 +4,7 @@ News An RSS/Atom feed reader. Requires ownCloud backgroundjobs or an updater script to be enabled to update your feeds. See the README.md in the apps top directory AGPL - 3.406 + 3.901 7.0.3 Bernhard Posselt, Alessandro Cosentino, Jan-Christoph Borchardt diff --git a/db/feed.php b/db/feed.php index 0f5a9ba47..373058320 100644 --- a/db/feed.php +++ b/db/feed.php @@ -25,6 +25,10 @@ use \OCP\AppFramework\Db\Entity; * @method string getUrl() * @method string getTitle() * @method void setTitle(string $value) + * @method string getLastModified() + * @method void setLastModified(string $value) + * @method string getEtag() + * @method void setEtag(string $value) * @method string getFaviconLink() * @method void setFaviconLink(string $value) * @method integer getAdded() @@ -57,6 +61,8 @@ class Feed extends Entity implements IAPI, \JsonSerializable { protected $preventUpdate; protected $deletedAt; protected $articlesPerUpdate; + protected $lastModified; + protected $etag; public function __construct(){ $this->addType('parentId', 'integer'); @@ -111,6 +117,8 @@ class Feed extends Entity implements IAPI, \JsonSerializable { 'added', 'folderId', 'unreadCount', + 'lastModified', + 'etag', 'link' ]); } diff --git a/fetcher/feedfetcher.php b/fetcher/feedfetcher.php index a2023dd0e..a3a2ab8bb 100644 --- a/fetcher/feedfetcher.php +++ b/fetcher/feedfetcher.php @@ -45,14 +45,22 @@ class FeedFetcher implements IFeedFetcher { * @param string $url remote url of the feed * @param boolean $getFavicon if the favicon should also be fetched, * defaults to true + * @param string $lastModified a last modified value from an http header + * defaults to false. If lastModified matches the http header from the feed + * no results are fetched + * @param string $etag an etag from an http header. + * If lastModified matches the http header from the feed + * no results are fetched * @throws FetcherException if simple pie fails * @return array an array containing the new feed and its items, first * element being the Feed and second element being an array of Items */ - public function fetch($url, $getFavicon=true) { - $resource = $this->reader->download($url); + public function fetch($url, $getFavicon=true, $lastModified=null, + $etag=null) { + $resource = $this->reader->download($url, $lastModified, $etag); $modified = $resource->getLastModified(); + $etag = $resource->getEtag(); try { $parser = $this->reader->getParser(); @@ -79,7 +87,9 @@ class FeedFetcher implements IFeedFetcher { $items[] = $this->buildItem($item); } - $feed = $this->buildFeed($parsedFeed, $url, $getFavicon, $modified); + $feed = $this->buildFeed( + $parsedFeed, $url, $getFavicon, $modified, $etag + ); return [$feed, $items]; @@ -144,7 +154,8 @@ class FeedFetcher implements IFeedFetcher { } - protected function buildFeed($parsedFeed, $url, $getFavicon, $modified) { + protected function buildFeed($parsedFeed, $url, $getFavicon, $modified, + $etag) { $feed = new Feed(); // unescape content because angularjs helps against XSS @@ -157,6 +168,8 @@ class FeedFetcher implements IFeedFetcher { $feed->setTitle($title); $feed->setUrl($url); + $feed->setLastModified($modified); + $feed->setEtag($etag); $link = $parsedFeed->getUrl(); if (!$link) { diff --git a/fetcher/fetcher.php b/fetcher/fetcher.php index ae46d6212..c93402e7f 100644 --- a/fetcher/fetcher.php +++ b/fetcher/fetcher.php @@ -36,14 +36,21 @@ class Fetcher { * @param string $url remote url of the feed * @param boolean $getFavicon if the favicon should also be fetched, * defaults to true + * @param string $lastModified a last modified value from an http header + * defaults to false. If lastModified matches the http header from the feed + * no results are fetched + * @param string $etag an etag from an http header. + * If lastModified matches the http header from the feed + * no results are fetched * @throws FetcherException if simple pie fails * @return array an array containing the new feed and its items, first * element being the Feed and second element being an array of Items */ - public function fetch($url, $getFavicon=true){ + public function fetch($url, $getFavicon=true, $lastModified=null, + $etag=null) { foreach($this->fetchers as $fetcher){ if($fetcher->canHandle($url)){ - return $fetcher->fetch($url, $getFavicon); + return $fetcher->fetch($url, $getFavicon, $lastModified, $etag); } } diff --git a/fetcher/ifeedfetcher.php b/fetcher/ifeedfetcher.php index 68b1bcf64..388b491bf 100644 --- a/fetcher/ifeedfetcher.php +++ b/fetcher/ifeedfetcher.php @@ -19,11 +19,17 @@ interface IFeedFetcher { * @param string $url remote url of the feed * @param boolean $getFavicon if the favicon should also be fetched, * defaults to true + * @param string $lastModified a last modified value from an http header + * defaults to false. If lastModified matches the http header from the feed + * no results are fetched + * @param string $etag an etag from an http header. + * If lastModified matches the http header from the feed + * no results are fetched * @throws FetcherException if the fetcher encounters a problem * @return array an array containing the new feed and its items, first * element being the Feed and second element being an array of Items */ - function fetch($url, $getFavicon=true); + function fetch($url, $getFavicon=true, $lastModified=null, $etag=null); /** * @param string $url the url that should be fetched diff --git a/tests/unit/db/FeedTest.php b/tests/unit/db/FeedTest.php index 936948813..dd0c52da5 100644 --- a/tests/unit/db/FeedTest.php +++ b/tests/unit/db/FeedTest.php @@ -20,6 +20,8 @@ class FeedTest extends \PHPUnit_Framework_TestCase { private function createFeed() { $feed = new Feed(); $feed->setId(3); + $feed->setLastModified(44); + $feed->setEtag(45); $feed->setUrl('http://google.com/some/weird/path'); $feed->setTitle('title'); $feed->setFaviconLink('favicon'); @@ -42,6 +44,8 @@ class FeedTest extends \PHPUnit_Framework_TestCase { 'added' => 123, 'folderId' => 1, 'unreadCount' => 321, + 'lastModified' => 44, + 'etag' => 45, 'link' => 'https://www.google.com/some/weird/path' ], $feed->toAPI()); } diff --git a/tests/unit/fetcher/FeedFetcherTest.php b/tests/unit/fetcher/FeedFetcherTest.php index 1f3b3d108..db954d952 100644 --- a/tests/unit/fetcher/FeedFetcherTest.php +++ b/tests/unit/fetcher/FeedFetcherTest.php @@ -44,6 +44,7 @@ class FeedFetcherTest extends \PHPUnit_Framework_TestCase { private $feedImage; private $webFavicon; private $modified; + private $etag; protected function setUp(){ $this->reader = $this->getMockBuilder( @@ -97,6 +98,7 @@ class FeedFetcherTest extends \PHPUnit_Framework_TestCase { $this->webFavicon = 'http://anon.google.com'; $this->authorMail = 'doe@joes.com'; $this->modified = 3; + $this->etag = 'yo'; } @@ -115,6 +117,9 @@ class FeedFetcherTest extends \PHPUnit_Framework_TestCase { $this->client->expects($this->once()) ->method('getLastModified') ->will($this->returnValue($this->modified)); + $this->client->expects($this->once()) + ->method('getEtag') + ->will($this->returnValue($this->etag)); if ($noParser) { $this->reader->expects($this->once()) @@ -199,6 +204,8 @@ class FeedFetcherTest extends \PHPUnit_Framework_TestCase { $feed->setUrl($this->url); $feed->setLink($this->feedLink); $feed->setAdded($this->time); + $feed->setLastModified($this->modified); + $feed->setEtag($this->etag); if($hasFavicon) { $this->faviconFetcher->expects($this->once()) @@ -249,6 +256,8 @@ class FeedFetcherTest extends \PHPUnit_Framework_TestCase { $feed->setLink($this->feedLink); $feed->setAdded($this->time); $feed->setFaviconLink(null); + $feed->setLastModified($this->modified); + $feed->setEtag($this->etag); $item = $this->createItem(); $this->expectFeed('getItems', [$this->item]); -- cgit v1.2.3