diff --git a/app/Actions/DispatchWebhookJob.php b/app/Actions/DispatchWebhookJob.php index c7e75552d..57cb2feab 100644 --- a/app/Actions/DispatchWebhookJob.php +++ b/app/Actions/DispatchWebhookJob.php @@ -73,10 +73,16 @@ class DispatchWebhookJob implements ShouldQueue $themeResponse = Theme::dispatch(ThemeEvents::WEBHOOK_CALL_BEFORE, $this->event, $this->webhook, $this->detail); $webhookData = $themeResponse ?? $this->buildWebhookData(); - $response = Http::asJson() - ->withOptions(['allow_redirects' => ['strict' => true]]) - ->timeout(3) - ->post($this->webhook->endpoint, $webhookData); + try { + $response = Http::asJson() + ->withOptions(['allow_redirects' => ['strict' => true]]) + ->timeout(3) + ->post($this->webhook->endpoint, $webhookData); + + } catch (\Exception $exception) { + Log::error("Webhook call to endpoint {$this->webhook->endpoint} failed with error \"{$exception->getMessage()}\""); + return; + } if ($response->failed()) { Log::error("Webhook call to endpoint {$this->webhook->endpoint} failed with status {$response->status()}"); diff --git a/tests/Actions/WebhookCallTest.php b/tests/Actions/WebhookCallTest.php index 7abf3fdb9..920bc2864 100644 --- a/tests/Actions/WebhookCallTest.php +++ b/tests/Actions/WebhookCallTest.php @@ -60,6 +60,18 @@ class WebhookCallTest extends TestCase $this->assertTrue($logger->hasError('Webhook call to endpoint https://wh.example.com failed with status 500')); } + public function test_webhook_call_exception_is_caught_and_logged() + { + Http::shouldReceive('asJson')->andThrow(new \Exception('Failed to perform request')); + + $logger = $this->withTestLogger(); + $this->newWebhook(['active' => true, 'endpoint' => 'https://wh.example.com'], ['all']); + + $this->runEvent(ActivityType::ROLE_CREATE); + + $this->assertTrue($logger->hasError('Webhook call to endpoint https://wh.example.com failed with error "Failed to perform request"')); + } + public function test_webhook_call_data_format() { Http::fake([