diff --git a/classes/feeds.php b/classes/feeds.php
index 4a34945c..1375f0c3 100755
--- a/classes/feeds.php
+++ b/classes/feeds.php
@@ -1030,6 +1030,8 @@ class Feeds extends Handler_Protected {
print "";
print "";
+ print "
";
+
print "";
print_notice("Provided URL is a HTML page referencing multiple feeds, please select required feed from the dropdown menu below.");
print "
";
diff --git a/include/functions.php b/include/functions.php
index 46f55d4e..72cf695f 100644
--- a/include/functions.php
+++ b/include/functions.php
@@ -345,6 +345,12 @@
global $fetch_last_content_type;
global $fetch_curl_used;
+ $fetch_last_error = false;
+ $fetch_last_error_code = -1;
+ $fetch_last_error_content = "";
+ $fetch_last_content_type = "";
+ $fetch_curl_used = false;
+
if (!is_array($options)) {
// falling back on compatibility shim
@@ -478,6 +484,7 @@
$context = stream_context_create(array(
'http' => array(
'method' => 'GET',
+ 'ignore_errors' => true,
'timeout' => $timeout ? $timeout : FILE_FETCH_TIMEOUT,
'protocol_version'=> 1.1,
'header' => "If-Modified-Since: ".gmdate("D, d M Y H:i:s \\G\\M\\T\r\n", $timestamp)
@@ -486,6 +493,7 @@
$context = stream_context_create(array(
'http' => array(
'method' => 'GET',
+ 'ignore_errors' => true,
'timeout' => $timeout ? $timeout : FILE_FETCH_TIMEOUT,
'protocol_version'=> 1.1
)));
@@ -495,7 +503,6 @@
$data = @file_get_contents($url, false, $context);
- $fetch_last_content_type = false; // reset if no type was sent from server
if (isset($http_response_header) && is_array($http_response_header)) {
foreach ($http_response_header as $h) {
if (substr(strtolower($h), 0, 13) == 'content-type:') {
@@ -510,7 +517,7 @@
}
}
- if (!$data) {
+ if ($fetch_last_error_code != 200) {
$error = error_get_last();
if ($error['message'] != $old_error['message']) {
@@ -518,6 +525,10 @@
} else {
$fetch_last_error = "HTTP Code: $fetch_last_error_code";
}
+
+ $fetch_last_error_content = $data;
+
+ return false;
}
return $data;
}
@@ -1720,6 +1731,8 @@
$auth_login = '', $auth_pass = '') {
global $fetch_last_error;
+ global $fetch_last_error_content;
+ global $fetch_last_error_code;
require_once "include/rssfuncs.php";
@@ -1730,6 +1743,10 @@
$contents = @fetch_file_contents($url, false, $auth_login, $auth_pass);
if (!$contents) {
+ if (preg_match("/cloudflare\.com/", $fetch_last_error_content)) {
+ $fetch_last_error .= " (feed behind Cloudflare)";
+ }
+
return array("code" => 5, "message" => $fetch_last_error);
}
diff --git a/js/functions.js b/js/functions.js
index 63ff4121..db18ac6d 100755
--- a/js/functions.js
+++ b/js/functions.js
@@ -804,6 +804,15 @@ function quickAddFeed() {
id: "feedAddDlg",
title: __("Subscribe to Feed"),
style: "width: 600px",
+ show_error: function(msg) {
+ var elem = $("fadd_error_message");
+
+ elem.innerHTML = msg;
+
+ if (!Element.visible(elem))
+ new Effect.Appear(elem);
+
+ },
execute: function() {
if (this.validate()) {
console.log(dojo.objectToQuery(this.attr('value')));
@@ -811,6 +820,7 @@ function quickAddFeed() {
var feed_url = this.attr('value').feed;
Element.show("feed_add_spinner");
+ Element.hide("fadd_error_message");
new Ajax.Request("backend.php", {
parameters: dojo.objectToQuery(this.attr('value')),
@@ -841,10 +851,10 @@ function quickAddFeed() {
updateFeedList();
break;
case 2:
- alert(__("Specified URL seems to be invalid."));
+ dialog.show_error(__("Specified URL seems to be invalid."));
break;
case 3:
- alert(__("Specified URL doesn't seem to contain any feeds."));
+ dialog.show_error(__("Specified URL doesn't seem to contain any feeds."));
break;
case 4:
feeds = rc['feeds'];
@@ -868,16 +878,16 @@ function quickAddFeed() {
break;
case 5:
- alert(__("Couldn't download the specified URL: %s").
+ dialog.show_error(__("Couldn't download the specified URL: %s").
replace("%s", rc['message']));
break;
case 6:
- alert(__("XML validation failed: %s").
+ dialog.show_error(__("XML validation failed: %s").
replace("%s", rc['message']));
break;
break;
case 0:
- alert(__("You are already subscribed to this feed."));
+ dialog.show_error(__("You are already subscribed to this feed."));
break;
}