From 98a94855dc6b909b75629c6630c3795c68e7d560 Mon Sep 17 00:00:00 2001
From: Dag
Date: Wed, 20 Dec 2023 03:16:25 +0100
Subject: [PATCH] feat: embed response in http exception (#3847)
---
bridges/GettrBridge.php | 10 +++++++++-
config.default.ini.php | 3 ++-
lib/contents.php | 15 ++-------------
lib/http.php | 24 +++++++++++++++++++++++-
templates/exception.html.php | 23 +++++++++++++++++++++++
5 files changed, 59 insertions(+), 16 deletions(-)
diff --git a/bridges/GettrBridge.php b/bridges/GettrBridge.php
index 74804043..d3b9b899 100644
--- a/bridges/GettrBridge.php
+++ b/bridges/GettrBridge.php
@@ -33,7 +33,15 @@ class GettrBridge extends BridgeAbstract
$user,
min($this->getInput('limit'), 20)
);
- $data = json_decode(getContents($api), false);
+ try {
+ $json = getContents($api);
+ } catch (HttpException $e) {
+ if ($e->getCode() === 400 && str_contains($e->response->getBody(), 'E_USER_NOTFOUND')) {
+ throw new \Exception('User not found: ' . $user);
+ }
+ throw $e;
+ }
+ $data = json_decode($json, false);
foreach ($data->result->aux->post as $post) {
$this->items[] = [
diff --git a/config.default.ini.php b/config.default.ini.php
index 52786aef..201b1414 100644
--- a/config.default.ini.php
+++ b/config.default.ini.php
@@ -47,7 +47,8 @@ enable_debug_mode = false
enable_maintenance_mode = false
[http]
-timeout = 60
+; Operation timeout in seconds
+timeout = 30
useragent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0"
; Max http response size in MB
diff --git a/lib/contents.php b/lib/contents.php
index a4def21a..8676a2a8 100644
--- a/lib/contents.php
+++ b/lib/contents.php
@@ -101,19 +101,8 @@ function getContents(
$response = $response->withBody($cachedResponse->getBody());
break;
default:
- $exceptionMessage = sprintf(
- '%s resulted in %s %s %s',
- $url,
- $response->getCode(),
- $response->getStatusLine(),
- // If debug, include a part of the response body in the exception message
- Debug::isEnabled() ? mb_substr($response->getBody(), 0, 500) : '',
- );
-
- if (CloudFlareException::isCloudFlareResponse($response)) {
- throw new CloudFlareException($exceptionMessage, $response->getCode());
- }
- throw new HttpException(trim($exceptionMessage), $response->getCode());
+ $e = HttpException::fromResponse($response, $url);
+ throw $e;
}
if ($returnFull === true) {
// todo: return the actual response object
diff --git a/lib/http.php b/lib/http.php
index eb70705f..bfa6b6bf 100644
--- a/lib/http.php
+++ b/lib/http.php
@@ -2,7 +2,29 @@
class HttpException extends \Exception
{
- // todo: should include the failing http response (if present)
+ public ?Response $response;
+
+ public function __construct(string $message = '', int $statusCode = 0, ?Response $response = null)
+ {
+ parent::__construct($message, $statusCode);
+ $this->response = $response ?? new Response('', 0);
+ }
+
+ public static function fromResponse(Response $response, string $url): HttpException
+ {
+ $message = sprintf(
+ '%s resulted in %s %s %s',
+ $url,
+ $response->getCode(),
+ $response->getStatusLine(),
+ // If debug, include a part of the response body in the exception message
+ Debug::isEnabled() ? mb_substr($response->getBody(), 0, 500) : '',
+ );
+ if (CloudFlareException::isCloudFlareResponse($response)) {
+ return new CloudFlareException($message, $response->getCode(), $response);
+ }
+ return new HttpException(trim($message), $response->getCode(), $response);
+ }
}
final class CloudFlareException extends HttpException
diff --git a/templates/exception.html.php b/templates/exception.html.php
index dac0ad26..e1dd97c1 100644
--- a/templates/exception.html.php
+++ b/templates/exception.html.php
@@ -16,6 +16,13 @@
+ getCode() === 400): ?>
+ 400 Bad Request
+
+ This is usually caused by an incorrectly constructed http request.
+
+
+
getCode() === 404): ?>
404 Page Not Found
@@ -40,6 +47,22 @@
+ getCode() === 0): ?>
+
+ See
+
+ https://curl.haxx.se/libcurl/c/libcurl-errors.html
+
+ for description of the curl error code.
+
+
+
+
+ https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/= raw($e->getCode()) ?>
+
+
+
+
getCode() === 10): ?>
The rss feed is completely empty