From 9d930af9e109884f219a2254dc444c7a943b1e6e Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 30 Oct 2017 13:13:10 +0300 Subject: [PATCH] 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 --- classes/rssutils.php | 2 +- include/functions.php | 58 ++++++++++++++++++++++--------------------- 2 files changed, 31 insertions(+), 29 deletions(-) diff --git a/classes/rssutils.php b/classes/rssutils.php index 30d35dfa..d6fe048f 100644 --- a/classes/rssutils.php +++ b/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)); diff --git a/include/functions.php b/include/functions.php index 392042b9..f883a12e 100644 --- a/include/functions.php +++ b/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); + foreach ($http_response_header as $header) { + if (strstr($header, ": ") !== FALSE) { + list ($key, $value) = explode(": ", $header); - $key = strtolower($key); + $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 ($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;