فهرست منبع

Added support for returning original source URI of feeds is they omit a self-referencing feed URI - implements ZF-8788

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@22092 44c647ce-9c0f-0410-b52a-842ac1e357ba
padraic 15 سال پیش
والد
کامیت
910781af98

+ 3 - 1
library/Zend/Feed/Reader.php

@@ -286,7 +286,9 @@ class Zend_Feed_Reader
                 require_once 'Zend/Feed/Exception.php';
                 throw new Zend_Feed_Exception('Feed failed to load, got response code ' . $response->getStatus());
             }
-            return self::importString($response->getBody());
+            $reader = self::importString($response->getBody());
+            $reader->setOriginalSourceUri($uri);
+            return $reader;
         }
     }
 

+ 4 - 0
library/Zend/Feed/Reader/Feed/Atom.php

@@ -290,6 +290,10 @@ class Zend_Feed_Reader_Feed_Atom extends Zend_Feed_Reader_FeedAbstract
 
         $link = $this->getExtension('Atom')->getFeedLink();
 
+        if (is_null($link) || empty($link)) {
+            $link = $this->getOriginalSourceUri();
+        }
+
         $this->_data['feedlink'] = $link;
 
         return $this->_data['feedlink'];

+ 2 - 2
library/Zend/Feed/Reader/Feed/Rss.php

@@ -435,8 +435,8 @@ class Zend_Feed_Reader_Feed_Rss extends Zend_Feed_Reader_FeedAbstract
 
         $link = $this->getExtension('Atom')->getFeedLink();
 
-        if (!$link) {
-            $link = null;
+        if (is_null($link) || empty($link)) {
+            $link = $this->getOriginalSourceUri();
         }
 
         $this->_data['feedlink'] = $link;

+ 30 - 0
library/Zend/Feed/Reader/FeedAbstract.php

@@ -80,6 +80,13 @@ abstract class Zend_Feed_Reader_FeedAbstract implements Zend_Feed_Reader_FeedInt
     protected $_extensions = array();
 
     /**
+     * Original Source URI (set if imported from a URI)
+     *
+     * @var string
+     */
+    protected $_originalSourceUri = null;
+
+    /**
      * Constructor
      *
      * @param DomDocument The DOM object for the feed's XML
@@ -101,6 +108,29 @@ abstract class Zend_Feed_Reader_FeedAbstract implements Zend_Feed_Reader_FeedInt
     }
 
     /**
+     * Set an original source URI for the feed being parsed. This value
+     * is returned from getFeedLink() method if the feed does not carry
+     * a self-referencing URI.
+     *
+     * @param string $uri
+     */
+    public function setOriginalSourceUri($uri)
+    {
+        $this->_originalSourceUri = $uri;
+    }
+
+    /**
+     * Get an original source URI for the feed being parsed. Returns null if
+     * unset or the feed was not imported from a URI.
+     *
+     * @return string|null
+     */
+    public function getOriginalSourceUri()
+    {
+        return $this->_originalSourceUri;
+    }
+
+    /**
      * Get the number of feed entries.
      * Required by the Iterator interface.
      *

+ 9 - 0
tests/Zend/Feed/Reader/Feed/AtomTest.php

@@ -390,6 +390,15 @@ class Zend_Feed_Reader_Feed_AtomTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('http://www.example.com/feed/atom', $feed->getFeedLink());
     }
 
+    public function testGetsOriginalSourceUriIfFeedLinkNotAvailableFromFeed()
+    {
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/feedlink/plain/atom10_NoFeedLink.xml')
+        );
+        $feed->setOriginalSourceUri('http://www.example.com/feed/atom');
+        $this->assertEquals('http://www.example.com/feed/atom', $feed->getFeedLink());
+    }
+
     /**
      * Get Pubsubhubbub Hubs
      */

+ 9 - 0
tests/Zend/Feed/Reader/Feed/RssTest.php

@@ -1867,6 +1867,15 @@ class Zend_Feed_Reader_Feed_RssTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('http://www.example.com/feed/rss', $feed->getFeedLink());
     }
 
+    public function testGetsOriginalSourceUriIfFeedLinkNotAvailableFromFeed()
+    {
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/feedlink/plain/rss20_NoFeedLink.xml')
+        );
+        $feed->setOriginalSourceUri('http://www.example.com/feed/rss');
+        $this->assertEquals('http://www.example.com/feed/rss', $feed->getFeedLink());
+    }
+
     public function testGetsFeedLinkFromRss094()
     {
         $feed = Zend_Feed_Reader::importString(

+ 3 - 0
tests/Zend/Feed/Reader/Feed/_files/Atom/feedlink/plain/atom10_NoFeedLink.xml

@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+</feed>

+ 6 - 0
tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss20_NoFeedLink.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<rss version="2.0"
+xmlns:atom="http://www.w3.org/2005/Atom">
+    <channel>
+    </channel>
+</rss>