$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()}");
$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([