Added webhook call http exception handling

Will now catch and log errors on events such as http timeouts.
For #3122
This commit is contained in:
Dan Brown 2022-01-03 18:37:05 +00:00
parent fe54c7f27a
commit 6e18620a0a
No known key found for this signature in database
GPG Key ID: 46D9F943C24A2EF9
2 changed files with 22 additions and 4 deletions

View File

@ -73,10 +73,16 @@ class DispatchWebhookJob implements ShouldQueue
$themeResponse = Theme::dispatch(ThemeEvents::WEBHOOK_CALL_BEFORE, $this->event, $this->webhook, $this->detail); $themeResponse = Theme::dispatch(ThemeEvents::WEBHOOK_CALL_BEFORE, $this->event, $this->webhook, $this->detail);
$webhookData = $themeResponse ?? $this->buildWebhookData(); $webhookData = $themeResponse ?? $this->buildWebhookData();
$response = Http::asJson() try {
->withOptions(['allow_redirects' => ['strict' => true]]) $response = Http::asJson()
->timeout(3) ->withOptions(['allow_redirects' => ['strict' => true]])
->post($this->webhook->endpoint, $webhookData); ->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()) { if ($response->failed()) {
Log::error("Webhook call to endpoint {$this->webhook->endpoint} failed with status {$response->status()}"); Log::error("Webhook call to endpoint {$this->webhook->endpoint} failed with status {$response->status()}");

View File

@ -60,6 +60,18 @@ class WebhookCallTest extends TestCase
$this->assertTrue($logger->hasError('Webhook call to endpoint https://wh.example.com failed with status 500')); $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() public function test_webhook_call_data_format()
{ {
Http::fake([ Http::fake([