summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBernhard Posselt <dev@bernhard-posselt.com>2014-10-22 11:06:43 +0200
committerBernhard Posselt <dev@bernhard-posselt.com>2014-10-22 11:06:43 +0200
commitdc8b8301d387d48e38624423cba9cf5323f26291 (patch)
treebbc8f280f74f4f628d0f2720e410bf09f2134325
parentcc3fa38cee2e24dacb940ec5d7ca41e593aa824a (diff)
fix #302
-rw-r--r--appinfo/database.xml10
-rw-r--r--appinfo/info.xml2
-rw-r--r--db/feed.php8
-rw-r--r--fetcher/feedfetcher.php21
-rw-r--r--fetcher/fetcher.php11
-rw-r--r--fetcher/ifeedfetcher.php8
-rw-r--r--tests/unit/db/FeedTest.php4
-rw-r--r--tests/unit/fetcher/FeedFetcherTest.php9
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
@@ -111,6 +111,16 @@
<notnull>false</notnull>
</field>
<field>
+ <name>last_modified</name>
+ <type>clob</type>
+ <notnull>false</notnull>
+ </field>
+ <field>
+ <name>etag</name>
+ <type>clob</type>
+ <notnull>false</notnull>
+ </field>
+ <field>
<name>added</name>
<type>integer</type>
<default></default>
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 @@
<name>News</name>
<description>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</description>
<licence>AGPL</licence>
- <version>3.406</version>
+ <version>3.901</version>
<require>7.0.3</require>
<author>Bernhard Posselt, Alessandro Cosentino, Jan-Christoph Borchardt</author>
</info>
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]);