/usr/share/php/Horde/Feed.php is in php-horde-feed 2.0.1-4.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | <?php
/**
* Portions Copyright 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
* Copyright 2007-2012 Horde LLC (http://www.horde.org/)
*
* @author Chuck Hagenbuch <chuck@horde.org>
* @license http://www.horde.org/licenses/bsd BSD
* @category Horde
* @package Feed
*/
/**
* @author Chuck Hagenbuch <chuck@horde.org>
* @license http://www.horde.org/licenses/bsd BSD
* @category Horde
* @package Feed
*/
class Horde_Feed
{
/**
* Create a Feed object based on a DOMDocument.
*
* @param DOMDocument $doc The DOMDocument object to import.
*
* @throws Horde_Feed_Exception
*
* @return Horde_Feed_Base The feed object imported from $doc
*/
public static function create(DOMDocument $doc, $uri = null)
{
// Try to find the base feed element or a single <entry> of an
// Atom feed.
if ($feed = $doc->getElementsByTagName('feed')->item(0)) {
// Return an Atom feed.
return new Horde_Feed_Atom($feed, $uri);
} elseif ($entry = $doc->getElementsByTagName('entry')->item(0)) {
// Return an Atom single-entry feed.
$feeddoc = new DOMDocument($doc->version,
$doc->actualEncoding);
$feed = $feeddoc->appendChild($feeddoc->createElement('feed'));
$feed->appendChild($feeddoc->importNode($entry, true));
return new Horde_Feed_Atom($feed, $uri);
}
// Try to find the base feed element of an RSS feed.
if ($channel = $doc->getElementsByTagName('channel')->item(0)) {
// Return an RSS feed.
return new Horde_Feed_Rss($channel, $uri);
}
// Try to find an outline element of an OPML blogroll.
if ($outline = $doc->getElementsByTagName('outline')->item(0)) {
// Return a blogroll feed.
return new Horde_Feed_Blogroll($doc->documentElement, $uri);
}
// $doc does not appear to be a valid feed of the supported
// types.
throw new Horde_Feed_Exception('Invalid or unsupported feed format: '
. substr($doc->saveXML(), 0, 80) . '...');
}
/**
* Reads a feed represented by $string.
*
* @param string $string The XML content of the feed.
* @param string $uri The feed's URI location, if known.
*
* @throws Horde_Feed_Exception
*
* @return Horde_Feed_Base
*/
public static function read($string, $uri = null)
{
// Load the feed as a DOMDocument object.
libxml_use_internal_errors(true);
$doc = new DOMDocument;
$doc->recover = true;
$loaded = $doc->loadXML($string);
if (!$loaded) {
$loaded = $doc->loadHTML($string);
if (!$loaded) {
self::_exception('DOMDocument cannot parse XML', libxml_get_last_error());
}
}
return self::create($doc);
}
/**
* Read a feed located at $uri
*
* @param string $uri The URI to fetch the feed from.
* @param Horde_Http_Client $httpclient The HTTP client to use.
*
* @throws Horde_Feed_Exception
*
* @return Horde_Feed_Base
*/
public static function readUri($uri, Horde_Http_Client $httpclient = null)
{
if (is_null($httpclient)) {
$httpclient = new Horde_Http_Client();
}
try {
$response = $httpclient->get($uri);
} catch (Horde_Http_Exception $e) {
throw new Horde_Feed_Exception('Error reading feed: ' . $e->getMessage());
}
if ($response->code != 200) {
throw new Horde_Feed_Exception('Unable to read feed, got response code ' . $response->code);
}
$feed = $response->getBody();
return self::read($feed, $uri);
}
/**
* Read a feed from $filename
*
* @param string $filename The location of the feed file on an accessible
* filesystem or through an available stream wrapper.
*
* @throws Horde_Feed_Exception
*
* @return Horde_Feed_Base
*/
public static function readFile($filename)
{
libxml_use_internal_errors(true);
$doc = new DOMDocument;
$doc->recover = true;
$filename = urlencode($filename);
$loaded = $doc->load($filename);
if (!$loaded) {
$loaded = $doc->loadHTMLFile($filename);
if (!$loaded) {
self::_exception('File could not be read or parsed', libxml_get_last_error());
}
}
return self::create($doc);
}
/**
* Builds an exception message from a libXMLError object.
*
* @param string $msg An error message.
* @param libXMLError $error An error object.
*
* @throws Horde_Feed_Exception
*/
protected static function _exception($msg, $error)
{
if ($error) {
$msg .= ': ' . $error->message;
if ($error->file) {
$msg .= sprintf(' in file %s, line %d, column %d',
$error->file, $error->line, $error->column);
}
}
throw new Horde_Feed_Exception($msg);
}
}
|