Просмотр исходного кода

Better XPath failure (#5317)

Report feeds as errored for more cases
Alexandre Alapetite 3 лет назад
Родитель
Сommit
5579dc88ab
2 измененных файлов с 9 добавлено и 7 удалено
  1. 8 5
      app/Models/Feed.php
  2. 1 2
      lib/lib_rss.php

+ 8 - 5
app/Models/Feed.php

@@ -641,16 +641,19 @@ class FreshRSS_Feed extends Minz_Model {
 			$doc = new DOMDocument();
 			$doc->recover = true;
 			$doc->strictErrorChecking = false;
+			$ok = false;
 
 			switch ($this->kind()) {
 				case FreshRSS_Feed::KIND_HTML_XPATH:
-					$doc->loadHTML($html, LIBXML_NONET | LIBXML_NOERROR | LIBXML_NOWARNING);
+					$ok = $doc->loadHTML($html, LIBXML_NONET | LIBXML_NOERROR | LIBXML_NOWARNING) !== false;
 					break;
 				case FreshRSS_Feed::KIND_XML_XPATH:
-					$doc->loadXML($html, LIBXML_NONET | LIBXML_NOERROR | LIBXML_NOWARNING);
+					$ok = $doc->loadXML($html, LIBXML_NONET | LIBXML_NOERROR | LIBXML_NOWARNING) !== false;
 					break;
-				default:
-					return null;
+			}
+
+			if (!$ok) {
+				return null;
 			}
 
 			$xpath = new DOMXPath($doc);
@@ -658,7 +661,7 @@ class FreshRSS_Feed extends Minz_Model {
 				htmlspecialchars(@$xpath->evaluate('normalize-space(' . $xPathFeedTitle . ')'), ENT_COMPAT, 'UTF-8');
 			$view->rss_base = htmlspecialchars(trim($xpath->evaluate('normalize-space(//base/@href)')), ENT_COMPAT, 'UTF-8');
 			$nodes = $xpath->query($xPathItem);
-			if (empty($nodes)) {
+			if ($nodes === false || $nodes->length === 0) {
 				return null;
 			}
 

+ 1 - 2
lib/lib_rss.php

@@ -485,8 +485,7 @@ function httpGet(string $url, string $cachePath, string $type = 'html', array $a
 		Minz_Log::warning('Error fetching content: HTTP code ' . $c_status . ': ' . $c_error . ' ' . $url);
 		$body = '';
 		// TODO: Implement HTTP 410 Gone
-	}
-	if (!is_string($body)) {
+	} elseif (!is_string($body) || strlen($body) === 0) {
 		$body = '';
 	} else {
 		$body = enforceHttpEncoding($body, $c_content_type);