Skip to content

Commit

Permalink
core: Add an option to return errors in different formats (#1071)
Browse files Browse the repository at this point in the history
Bridge errors are currently included as part of the feed to
notify users about erroneous bridges (before that, bridges
silently failed).

This solution, however, can produce a high load of error
messages if servers are down (see #994 for more details).

Admins may also not want to include error messages in feeds
in order to keep those kind of problems away from users or
simply to silently fail by choice.

This commit adds a new configuration section "error" with
one option "output" which can be set to following values:

"feed": To include error messages in the feed (default)
"http": To return a HTTP header for each error
"none": To disable error reporting

Note that errors are always logged to 'error.log' independent
of the settings above.

Closes #1066
  • Loading branch information
logmanoriginal committed Oct 31, 2019
1 parent a0afe36 commit e8536ac
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 46 deletions.
102 changes: 56 additions & 46 deletions actions/DisplayAction.php
Original file line number Diff line number Diff line change
Expand Up @@ -146,63 +146,73 @@ public function execute() {
} catch(Error $e) {
error_log($e);

$item = new \FeedItem();

// Create "new" error message every 24 hours
$this->userData['_error_time'] = urlencode((int)(time() / 86400));
if(Configuration::getConfig('error', 'output') === 'feed') {
$item = new \FeedItem();

// Create "new" error message every 24 hours
$this->userData['_error_time'] = urlencode((int)(time() / 86400));

// Error 0 is a special case (i.e. "trying to get property of non-object")
if($e->getCode() === 0) {
$item->setTitle(
'Bridge encountered an unexpected situation! ('
. $this->userData['_error_time']
. ')'
);
} else {
$item->setTitle(
'Bridge returned error '
. $e->getCode()
. '! ('
. $this->userData['_error_time']
. ')'
);
}

// Error 0 is a special case (i.e. "trying to get property of non-object")
if($e->getCode() === 0) {
$item->setTitle(
'Bridge encountered an unexpected situation! ('
. $this->userData['_error_time']
. ')'
);
} else {
$item->setTitle(
'Bridge returned error '
. $e->getCode()
. '! ('
. $this->userData['_error_time']
. ')'
$item->setURI(
(isset($_SERVER['REQUEST_URI']) ? parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) : '')
. '?'
. http_build_query($this->userData)
);
}

$item->setURI(
(isset($_SERVER['REQUEST_URI']) ? parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) : '')
. '?'
. http_build_query($this->userData)
);
$item->setTimestamp(time());
$item->setContent(buildBridgeException($e, $bridge));

$item->setTimestamp(time());
$item->setContent(buildBridgeException($e, $bridge));

$items[] = $item;
$items[] = $item;
} elseif(Configuration::getConfig('error', 'output') === 'http') {
header('Content-Type: text/html', true, $e->getCode());
die(buildTransformException($e, $bridge));
}
} catch(Exception $e) {
error_log($e);

$item = new \FeedItem();
if(Configuration::getConfig('error', 'output') === 'feed') {
$item = new \FeedItem();

// Create "new" error message every 24 hours
$this->userData['_error_time'] = urlencode((int)(time() / 86400));
// Create "new" error message every 24 hours
$this->userData['_error_time'] = urlencode((int)(time() / 86400));

$item->setURI(
(isset($_SERVER['REQUEST_URI']) ? parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) : '')
. '?'
. http_build_query($this->userData)
);
$item->setURI(
(isset($_SERVER['REQUEST_URI']) ? parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) : '')
. '?'
. http_build_query($this->userData)
);

$item->setTitle(
'Bridge returned error '
. $e->getCode()
. '! ('
. $this->userData['_error_time']
. ')'
);
$item->setTimestamp(time());
$item->setContent(buildBridgeException($e, $bridge));
$item->setTitle(
'Bridge returned error '
. $e->getCode()
. '! ('
. $this->userData['_error_time']
. ')'
);
$item->setTimestamp(time());
$item->setContent(buildBridgeException($e, $bridge));

$items[] = $item;
$items[] = $item;
} elseif(Configuration::getConfig('error', 'output') === 'http') {
header('Content-Type: text/html', true, $e->getCode());
die(buildTransformException($e, $bridge));
}
}

// Store data in cache
Expand Down
9 changes: 9 additions & 0 deletions config.default.ini.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,15 @@
; Use a strong password to prevent others from guessing your login!
password = ""

[error]

; Defines how error messages are returned by RSS-Bridge
;
; "feed" = As part of the feed (default)
; "http" = As HTTP error message
; "none" = No errors are reported
output = "feed"

; --- Cache specific configuration ---------------------------------------------

[SQLiteCache]
Expand Down
3 changes: 3 additions & 0 deletions lib/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,9 @@ public static function loadConfiguration() {
&& !filter_var(self::getConfig('admin', 'email'), FILTER_VALIDATE_EMAIL))
self::reportConfigurationError('admin', 'email', 'Is not a valid email address');

if(!is_string(self::getConfig('error', 'output')))
self::reportConfigurationError('error', 'output', 'Is not a valid String');

}

/**
Expand Down

0 comments on commit e8536ac

Please sign in to comment.