aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--actions/DisplayAction.php8
-rw-r--r--bridges/RedditBridge.php6
-rw-r--r--bridges/Vk2Bridge.php2
-rw-r--r--bridges/VkBridge.php2
-rw-r--r--bridges/YoutubeBridge.php3
-rw-r--r--lib/http.php10
6 files changed, 24 insertions, 7 deletions
diff --git a/actions/DisplayAction.php b/actions/DisplayAction.php
index c51bb7cd..55f0d2fd 100644
--- a/actions/DisplayAction.php
+++ b/actions/DisplayAction.php
@@ -121,8 +121,12 @@ class DisplayAction implements ActionInterface
$items = $feedItems;
}
$feed = $bridge->getFeed();
- } catch (\Exception $e) {
- // Probably an exception inside a bridge
+ } catch (\Throwable $e) {
+ if ($e instanceof RateLimitException) {
+ // These are internally generated by bridges
+ $this->logger->info(sprintf('RateLimitException in DisplayAction(%s): %s', $bridge->getShortName(), create_sane_exception_message($e)));
+ return new Response(render(__DIR__ . '/../templates/exception.html.php', ['e' => $e]), 429);
+ }
if ($e instanceof HttpException) {
// Reproduce (and log) these responses regardless of error output and report limit
if ($e->getCode() === 429) {
diff --git a/bridges/RedditBridge.php b/bridges/RedditBridge.php
index ef74fdcd..03f279d8 100644
--- a/bridges/RedditBridge.php
+++ b/bridges/RedditBridge.php
@@ -93,12 +93,12 @@ class RedditBridge extends BridgeAbstract
{
$forbiddenKey = 'reddit_forbidden';
if ($this->cache->get($forbiddenKey)) {
- throw new HttpException('403 Forbidden', 403);
+ throw new RateLimitException();
}
$rateLimitKey = 'reddit_rate_limit';
if ($this->cache->get($rateLimitKey)) {
- throw new HttpException('429 Too Many Requests', 429);
+ throw new RateLimitException();
}
try {
@@ -108,8 +108,10 @@ class RedditBridge extends BridgeAbstract
// 403 Forbidden
// This can possibly mean that reddit has permanently blocked this server's ip address
$this->cache->set($forbiddenKey, true, 60 * 61);
+ throw new RateLimitException();
} elseif ($e->getCode() === 429) {
$this->cache->set($rateLimitKey, true, 60 * 61);
+ throw new RateLimitException();
}
throw $e;
}
diff --git a/bridges/Vk2Bridge.php b/bridges/Vk2Bridge.php
index 6fecba84..62ba8e05 100644
--- a/bridges/Vk2Bridge.php
+++ b/bridges/Vk2Bridge.php
@@ -194,7 +194,7 @@ class Vk2Bridge extends BridgeAbstract
public function collectData()
{
if ($this->cache->get($this->rateLimitCacheKey)) {
- throw new HttpException('429 Too Many Requests', 429);
+ throw new RateLimitException();
}
$u = $this->getInput('u');
diff --git a/bridges/VkBridge.php b/bridges/VkBridge.php
index 22957f26..0d62305b 100644
--- a/bridges/VkBridge.php
+++ b/bridges/VkBridge.php
@@ -519,7 +519,7 @@ class VkBridge extends BridgeAbstract
$uri = urljoin(self::URI, $headers['location'][0]);
if (str_contains($uri, '/429.html')) {
- returnServerError('VK responded "Too many requests"');
+ throw new RateLimitException();
}
if (!preg_match('#^https?://vk.com/#', $uri)) {
diff --git a/bridges/YoutubeBridge.php b/bridges/YoutubeBridge.php
index af14c856..647b1c42 100644
--- a/bridges/YoutubeBridge.php
+++ b/bridges/YoutubeBridge.php
@@ -82,13 +82,14 @@ class YoutubeBridge extends BridgeAbstract
{
$cacheKey = 'youtube_rate_limit';
if ($this->cache->get($cacheKey)) {
- throw new HttpException('429 Too Many Requests', 429);
+ throw new RateLimitException();
}
try {
$this->collectDataInternal();
} catch (HttpException $e) {
if ($e->getCode() === 429) {
$this->cache->set($cacheKey, true, 60 * 16);
+ throw new RateLimitException();
}
throw $e;
}
diff --git a/lib/http.php b/lib/http.php
index 39f0c727..0d21b958 100644
--- a/lib/http.php
+++ b/lib/http.php
@@ -1,5 +1,15 @@
<?php
+/**
+ * Thrown by bridges
+ */
+final class RateLimitException extends \Exception
+{
+}
+
+/**
+ * @internal Do not use this class in bridges
+ */
class HttpException extends \Exception
{
public ?Response $response;