]> BookStack Code Mirror - bookstack/commitdiff
Added webhook call http exception handling
authorDan Brown <redacted>
Mon, 3 Jan 2022 18:37:05 +0000 (18:37 +0000)
committerDan Brown <redacted>
Mon, 3 Jan 2022 18:37:56 +0000 (18:37 +0000)
Will now catch and log errors on events such as http timeouts.
For #3122

app/Actions/DispatchWebhookJob.php
tests/Actions/WebhookCallTest.php

index c7e75552d2b2b0f6eea226adbccb9cd24fc8e264..57cb2feabad6afc8b375070e8aaf3697f139e424 100644 (file)
@@ -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()}");
index 7abf3fdb937bb9ddc95f1ac0250b85bd4c48ad12..920bc286454bf24c8f6d711d1edbd7c4792dc5e4 100644 (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'));
     }
 
+    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([