Skip to content

Commit 01287b6

Browse files
authored
feat(http): improve context for failed http requests (#1484)
1 parent 477dfa9 commit 01287b6

File tree

5 files changed

+19
-5
lines changed

5 files changed

+19
-5
lines changed

packages/core/src/LogExceptionProcessor.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ final class LogExceptionProcessor implements ExceptionProcessor
1313
public function process(Throwable $throwable): Throwable
1414
{
1515
$items = [
16+
'class' => $throwable::class,
1617
'exception' => $throwable->getMessage(),
1718
'context' => ($throwable instanceof HasContext)
1819
? $throwable->context()

packages/http/src/HttpRequestFailed.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,28 @@
44

55
use Exception;
66
use Tempest\Core\HasContext;
7+
use Throwable;
78

89
/**
910
* Represents an HTTP exception.
1011
*/
1112
final class HttpRequestFailed extends Exception implements HasContext
1213
{
1314
public function __construct(
15+
public readonly Request $request,
1416
public readonly Status $status,
1517
?string $message = null,
1618
public readonly ?Response $cause = null,
17-
?\Throwable $previous = null,
19+
?Throwable $previous = null,
1820
) {
1921
parent::__construct($message ?: '', $status->value, $previous);
2022
}
2123

2224
public function context(): array
2325
{
2426
return [
27+
'request_uri' => $this->request->uri,
28+
'request_method' => $this->request->method->value,
2529
'status' => $this->status->value,
2630
'message' => $this->message,
2731
'cause' => $this->cause,

packages/icon/src/Icon.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44

55
use Exception;
66
use Tempest\EventBus\EventBus;
7+
use Tempest\Http\GenericRequest;
78
use Tempest\Http\HttpRequestFailed;
9+
use Tempest\Http\Method;
810
use Tempest\Http\Status;
911
use Tempest\HttpClient\HttpClient;
1012
use Tempest\Support\Str;
@@ -61,7 +63,11 @@ private function fetchSvg(string $collection, string $icon): ?string
6163
$response = $this->http->get($url);
6264

6365
if ($response->status !== Status::OK) {
64-
throw new HttpRequestFailed($response->status, cause: $response);
66+
throw new HttpRequestFailed(
67+
request: new GenericRequest(Method::GET, $url),
68+
status: $response->status,
69+
cause: $response,
70+
);
6571
}
6672

6773
$this->eventBus?->dispatch(new IconDownloaded(

packages/router/src/HandleRouteExceptionMiddleware.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public function __invoke(Request $request, HttpMiddlewareCallable $next): Respon
2626

2727
if ($response->status->isServerError() || $response->status->isClientError()) {
2828
throw new HttpRequestFailed(
29+
request: $request,
2930
status: $response->status,
3031
cause: $response,
3132
);

tests/Integration/Http/HttpExceptionHandlerTest.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,20 @@
99
use Tempest\Core\AppConfig;
1010
use Tempest\Core\FrameworkKernel;
1111
use Tempest\Core\Kernel;
12+
use Tempest\Http\GenericRequest;
1213
use Tempest\Http\HttpRequestFailed;
14+
use Tempest\Http\Method;
1315
use Tempest\Http\Response;
1416
use Tempest\Http\Responses\Redirect;
1517
use Tempest\Http\Session\CsrfTokenDidNotMatch;
1618
use Tempest\Http\Status;
1719
use Tempest\Router\Exceptions\HttpExceptionHandler;
18-
use Tempest\Router\Exceptions\RouteBindingFailed;
1920
use Tempest\Router\ResponseSender;
2021
use Tests\Tempest\Integration\FrameworkIntegrationTestCase;
2122
use Tests\Tempest\Integration\Http\Fixtures\ExceptionThatConvertsToRedirectResponse;
2223
use Tests\Tempest\Integration\Http\Fixtures\ExceptionWithContext;
2324
use Tests\Tempest\Integration\Http\Fixtures\NullExceptionProcessor;
25+
use Throwable;
2426

2527
final class HttpExceptionHandlerTest extends FrameworkIntegrationTestCase
2628
{
@@ -125,7 +127,7 @@ public function test_exception_handler_returns_same_code_as_http_exception(Statu
125127
{
126128
$this->callExceptionHandler(function () use ($status): void {
127129
$handler = $this->container->get(HttpExceptionHandler::class);
128-
$handler->handle(new HttpRequestFailed($status));
130+
$handler->handle(new HttpRequestFailed(new GenericRequest(Method::GET, '/test'), $status));
129131
});
130132

131133
$this->assertSame($status, $this->response->status);
@@ -164,7 +166,7 @@ private function callExceptionHandler(Closure $callback): void
164166
{
165167
try {
166168
$callback();
167-
} catch (\Throwable $throwable) {
169+
} catch (Throwable $throwable) {
168170
$this->assertSame('Shutdown.', $throwable->getMessage());
169171
}
170172
}

0 commit comments

Comments
 (0)