aboutsummaryrefslogtreecommitdiff
path: root/actions/DisplayAction.php
diff options
context:
space:
mode:
Diffstat (limited to 'actions/DisplayAction.php')
-rw-r--r--actions/DisplayAction.php88
1 files changed, 52 insertions, 36 deletions
diff --git a/actions/DisplayAction.php b/actions/DisplayAction.php
index efcddb69..b345bddc 100644
--- a/actions/DisplayAction.php
+++ b/actions/DisplayAction.php
@@ -16,16 +16,6 @@ class DisplayAction implements ActionInterface
{
public $userData = [];
- private function getReturnCode($error)
- {
- $returnCode = $error->getCode();
- if ($returnCode === 301 || $returnCode === 302) {
- # Don't pass redirect codes to the exterior
- $returnCode = 508;
- }
- return $returnCode;
- }
-
public function execute()
{
$bridgeFactory = new \BridgeFactory();
@@ -188,19 +178,31 @@ class DisplayAction implements ActionInterface
);
$item->setTimestamp(time());
- $item->setContent(buildBridgeException($e, $bridge));
+
+ $message = sprintf(
+ 'Uncaught Exception %s: %s at %s line %s',
+ get_class($e),
+ $e->getMessage(),
+ trim_path_prefix($e->getFile()),
+ $e->getLine()
+ );
+
+ $content = render_template('bridge-error.html.php', [
+ 'message' => $message,
+ 'stacktrace' => create_sane_stacktrace($e),
+ 'searchUrl' => self::createGithubSearchUrl($bridge),
+ 'issueUrl' => self::createGithubIssueUrl($bridge, $e, $message),
+ 'bridge' => $bridge,
+ ]);
+ $item->setContent($content);
$items[] = $item;
} elseif (Configuration::getConfig('error', 'output') === 'http') {
- header('Content-Type: text/html', true, $this->getReturnCode($e));
- $response = buildTransformException($e, $bridge);
- print $response;
- exit;
+ throw $e;
}
}
}
- // Store data in cache
$cache->saveData([
'items' => array_map(function ($i) {
return $i->toArray();
@@ -209,26 +211,40 @@ class DisplayAction implements ActionInterface
]);
}
- // Data transformation
- try {
- $formatFactory = new FormatFactory();
- $format = $formatFactory->create($format);
- $format->setItems($items);
- $format->setExtraInfos($infos);
- $lastModified = $cache->getTime();
- $format->setLastModified($lastModified);
- if ($lastModified) {
- header('Last-Modified: ' . gmdate('D, d M Y H:i:s ', $lastModified) . 'GMT');
- }
- header('Content-Type: ' . $format->getMimeType() . '; charset=' . $format->getCharset());
-
- echo $format->stringify();
- } catch (\Throwable $e) {
- error_log($e);
- header('Content-Type: text/html', true, $e->getCode());
- $response = buildTransformException($e, $bridge);
- print $response;
- exit;
+ $formatFactory = new FormatFactory();
+ $format = $formatFactory->create($format);
+ $format->setItems($items);
+ $format->setExtraInfos($infos);
+ $lastModified = $cache->getTime();
+ $format->setLastModified($lastModified);
+ if ($lastModified) {
+ header('Last-Modified: ' . gmdate('D, d M Y H:i:s ', $lastModified) . 'GMT');
}
+ header('Content-Type: ' . $format->getMimeType() . '; charset=' . $format->getCharset());
+ print $format->stringify();
+ }
+
+ private static function createGithubIssueUrl($bridge, $e, string $message): string
+ {
+ return sprintf('https://github.com/RSS-Bridge/rss-bridge/issues/new?%s', http_build_query([
+ 'title' => sprintf('%s failed with error %s', $bridge->getName(), $e->getCode()),
+ 'body' => sprintf(
+ "```\n%s\n\n%s\n\nQuery string:%s\nVersion:%s\n```",
+ $message,
+ implode("\n", create_sane_stacktrace($e)),
+ $_SERVER['QUERY_STRING'] ?? '',
+ Configuration::getVersion(),
+ ),
+ 'labels' => 'Bridge-Broken',
+ 'assignee' => $bridge->getMaintainer(),
+ ]));
+ }
+
+ private static function createGithubSearchUrl($bridge): string
+ {
+ return sprintf(
+ 'https://github.com/RSS-Bridge/rss-bridge/issues?q=%s',
+ urlencode('is:issue is:open ' . $bridge->getName())
+ );
}
}