diff options
| author | 2021-03-26 19:13:23 +0100 | |
|---|---|---|
| committer | 2021-03-26 19:13:23 +0100 | |
| commit | eeff1a17b0ae13c32560e9d1b59c6e82965f3e6d (patch) | |
| tree | 8224f828f2d9ea094f2a8f608c0eb1eef07793b1 | |
| parent | 49f920e19dff22e8026707d98cf93b556a2703a9 (diff) | |
Suport standard HTTP 410 Gone (#3561)
When a feed returns an HTTP 410 Gone, mute the corresponding feed, i.e. stop refreshing it.
Example of such feed, Les Décodeurs (Libération) https://rss.liberation.fr/rss/100893/
| -rwxr-xr-x | app/Controllers/feedController.php | 5 | ||||
| -rw-r--r-- | app/Models/Feed.php | 3 | ||||
| -rw-r--r-- | app/Models/FeedDAO.php | 5 | ||||
| -rw-r--r-- | lib/SimplePie/SimplePie.php | 20 | ||||
| -rw-r--r-- | lib/SimplePie/SimplePie/File.php | 1 |
5 files changed, 33 insertions, 1 deletions
diff --git a/app/Controllers/feedController.php b/app/Controllers/feedController.php index 7daba4822..463aa25ed 100755 --- a/app/Controllers/feedController.php +++ b/app/Controllers/feedController.php @@ -349,6 +349,11 @@ class FreshRSS_feed_Controller extends Minz_ActionController { } catch (FreshRSS_Feed_Exception $e) { Minz_Log::warning($e->getMessage()); $feedDAO->updateLastUpdate($feed->id(), true); + if ($e->getCode() === 410) { + // HTTP 410 Gone + Minz_Log::warning('Muting gone feed: ' . $feed->url(false)); + $feedDAO->mute($feed->id(), true); + } $feed->unlock(); continue; } diff --git a/app/Models/Feed.php b/app/Models/Feed.php index af9c54719..51d63ef42 100644 --- a/app/Models/Feed.php +++ b/app/Models/Feed.php @@ -287,7 +287,8 @@ class FreshRSS_Feed extends Minz_Model { if ((!$mtime) || $simplePie->error()) { $errorMessage = $simplePie->error(); throw new FreshRSS_Feed_Exception( - ($errorMessage == '' ? 'Unknown error for feed' : $errorMessage) . ' [' . $this->url . ']' + ($errorMessage == '' ? 'Unknown error for feed' : $errorMessage) . ' [' . $this->url . ']', + $simplePie->status_code() ); } diff --git a/app/Models/FeedDAO.php b/app/Models/FeedDAO.php index 43485451c..af599c2a6 100644 --- a/app/Models/FeedDAO.php +++ b/app/Models/FeedDAO.php @@ -192,6 +192,11 @@ class FreshRSS_FeedDAO extends Minz_ModelPdo implements FreshRSS_Searchable { } } + public function mute($id, $value = true) { + $sql = 'UPDATE `_feed` SET ttl=' . ($value ? '-' : '') . 'ABS(ttl) WHERE id=' . intval($id); + return $this->pdo->exec($sql); + } + public function changeCategory($idOldCat, $idNewCat) { $catDAO = FreshRSS_Factory::createCategoryDao(); $newCat = $catDAO->searchById($idNewCat); diff --git a/lib/SimplePie/SimplePie.php b/lib/SimplePie/SimplePie.php index 6a542e2c5..66171dea3 100644 --- a/lib/SimplePie/SimplePie.php +++ b/lib/SimplePie/SimplePie.php @@ -431,6 +431,13 @@ class SimplePie public $error; /** + * @var int HTTP status code + * @see SimplePie::status_code() + * @access private + */ + public $status_code; + + /** * @var object Instance of SimplePie_Sanitize (or other class) * @see SimplePie::set_sanitize_class() * @access private @@ -1677,6 +1684,7 @@ class SimplePie } $file = $this->registry->create('File', array($this->feed_url, $this->timeout, 5, $headers, $this->useragent, $this->force_fsockopen, $this->curl_options, $this->syslog_enabled)); + $this->status_code = $file->status_code; if ($file->success) { @@ -1733,6 +1741,8 @@ class SimplePie $file = $this->registry->create('File', array($this->feed_url, $this->timeout, 5, $headers, $this->useragent, $this->force_fsockopen, $this->curl_options, $this->syslog_enabled)); } } + $this->status_code = $file->status_code; + // If the file connection has an error, set SimplePie::error to that and quit if (!$file->success && !($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300))) { @@ -1843,6 +1853,16 @@ class SimplePie } /** + * Get the last HTTP status code + * + * @return int Status code + */ + public function status_code() + { + return $this->status_code; + } + + /** * Get the raw XML * * This is the same as the old `$feed->enable_xml_dump(true)`, but returns diff --git a/lib/SimplePie/SimplePie/File.php b/lib/SimplePie/SimplePie/File.php index 7c7078cc5..0cb3b7861 100644 --- a/lib/SimplePie/SimplePie/File.php +++ b/lib/SimplePie/SimplePie/File.php @@ -123,6 +123,7 @@ class SimplePie_File curl_setopt($fp, CURLOPT_ENCODING, 'none'); $this->headers = curl_exec($fp); } + $this->status_code = curl_getinfo($fp, CURLINFO_HTTP_CODE); if (curl_errno($fp)) { $this->error = 'cURL error ' . curl_errno($fp) . ': ' . curl_error($fp); |
