Browse Source

fetch_file_contents: improve error handling

1. if request fails get error string from http  response status line
2. do not override http error with possible CURL/php specific last error
3. fix silent php error generated while processing response headers to get last modified value
Andrew Dolgov 2 years ago
parent
commit
9d930af9e1
2 changed files with 33 additions and 31 deletions
  1. 1 1
      classes/rssutils.php
  2. 32 30
      include/functions.php

+ 1 - 1
classes/rssutils.php

@@ -419,7 +419,7 @@ class RSSUtils {
 			$feed_data = trim($feed_data);
 
 			_debug("fetch done.", $debug_enabled);
-			_debug("source last modified: " . $fetch_last_modified);
+			_debug("source last modified: " . $fetch_last_modified, $debug_enabled);
 
 			if ($feed_data && $fetch_last_modified != $stored_last_modified) {
 				$last_modified_escaped = db_escape_string(substr($fetch_last_modified, 0, 245));

+ 32 - 30
include/functions.php

@@ -432,11 +432,18 @@
 			$contents = substr($ret, $headers_length);
 
 			foreach ($headers as $header) {
-				list ($key, $value) = explode(": ", $header);
+                if (strstr($header, ": ") !== FALSE) {
+                    list ($key, $value) = explode(": ", $header);
 
-				if (strtolower($key) == "last-modified") {
-					$fetch_last_modified = $value;
-				}
+                    if (strtolower($key) == "last-modified") {
+                        $fetch_last_modified = $value;
+                    }
+                }
+
+                if (substr(strtolower($header), 0, 7) == 'http/1.') {
+                    $fetch_last_error_code = (int) substr($header, 9, 3);
+                    $fetch_last_error = $header;
+                }
 			}
 
 			if (curl_errno($ch) === 23 || curl_errno($ch) === 61) {
@@ -450,11 +457,11 @@
 			$fetch_last_error_code = $http_code;
 
 			if ($http_code != 200 || $type && strpos($fetch_last_content_type, "$type") === false) {
+
 				if (curl_errno($ch) != 0) {
-					$fetch_last_error = curl_errno($ch) . " " . curl_error($ch);
-				} else {
-					$fetch_last_error = "HTTP Code: $http_code";
+					$fetch_last_error .=  "; " . curl_errno($ch) . " " . curl_error($ch);
 				}
+
 				$fetch_last_error_content = $contents;
 				curl_close($ch);
 				return false;
@@ -466,12 +473,6 @@
 				return false;
 			}
 
-			/*$fetch_last_modified = curl_getinfo($ch, CURLINFO_FILETIME);
-
-			if ($fetch_last_modified != -1) {
-				echo date("Y-m-d H:i:s", $fetch_last_modified); die;
-			}*/
-
 			curl_close($ch);
 
 			return $contents;
@@ -517,21 +518,24 @@
 			$data = @file_get_contents($url, false, $context);
 
 			if (isset($http_response_header) && is_array($http_response_header)) {
-				foreach ($http_response_header as $h) {
-					list ($key, $value) = explode(": ", $h);
-
-					$key = strtolower($key);
-
-					if ($key == 'content-type') {
-						$fetch_last_content_type = $value;
-						// don't abort here b/c there might be more than one
-						// e.g. if we were being redirected -- last one is the right one
-					} else if ($key == 'last-modified') {
-						$fetch_last_modified = $value;
-					}
+				foreach ($http_response_header as $header) {
+				    if (strstr($header, ": ") !== FALSE) {
+                        list ($key, $value) = explode(": ", $header);
+
+                        $key = strtolower($key);
+
+                        if ($key == 'content-type') {
+                            $fetch_last_content_type = $value;
+                            // don't abort here b/c there might be more than one
+                            // e.g. if we were being redirected -- last one is the right one
+                        } else if ($key == 'last-modified') {
+                            $fetch_last_modified = $value;
+                        }
+                    }
 
-					if (substr(strtolower($h), 0, 7) == 'http/1.') {
-						$fetch_last_error_code = (int) substr($h, 9, 3);
+					if (substr(strtolower($header), 0, 7) == 'http/1.') {
+						$fetch_last_error_code = (int) substr($header, 9, 3);
+						$fetch_last_error = $header;
 					}
 				}
 			}
@@ -540,9 +544,7 @@
 				$error = error_get_last();
 
 				if ($error['message'] != $old_error['message']) {
-					$fetch_last_error = $error["message"];
-				} else {
-					$fetch_last_error = "HTTP Code: $fetch_last_error_code";
+					$fetch_last_error .= "; " . $error["message"];
 				}
 
 				$fetch_last_error_content = $data;