CRM_Utils_Check - Catch Guzzle exception, same as core exception
authorTim Otten <totten@civicrm.org>
Mon, 16 May 2022 06:02:57 +0000 (23:02 -0700)
committerTim Otten <totten@civicrm.org>
Mon, 16 May 2022 06:02:57 +0000 (23:02 -0700)
Overview
--------

`checkExtensions()` is supposed to show status-messages which report on
any out-of-date extensions.  This requires a list of available updates.

Alas, the Internet is a big and scary place, and sometimes the list is
unavailable.  DNS servers, HTTP servers, timeouts, yadda yadda.  If it can't
get the list of extensions, it should show a status-message about this
problem.

Before
------

Throws an exception, causing a full failure in the page-view that does
the status-check.

After
-----

Catches the exception. Reports a status-message about the failure.

Comments
--------

It appears that this was probably the behavior before (ie `checkExtension()`
already has a try/catch for this kind of problem). However, the underlying
HTTP request was changed a versions back (ie from `HttpClient` to `Guzzle`)
which means that errors can get reported in other ways.

To simulate errors, I did this:

1. Run buggy/placeholder TCP service (`nc -l 8199`)
2. Hack `CRM_Extension_Browser::__construct()` to set `$this->repoUrl` to `http://localhost:8199`
3. Run `cv api System.check`

CRM/Utils/Check/Component/Env.php

index 39e1e3dde92f116cfed2045ce02a2b4077b3fa70..3476dba691cd5e1fae81c333d5dbe3097e94c925 100644 (file)
@@ -587,7 +587,7 @@ class CRM_Utils_Check_Component_Env extends CRM_Utils_Check_Component {
     try {
       $remotes = $extensionSystem->getBrowser()->getExtensions();
     }
-    catch (CRM_Extension_Exception $e) {
+    catch (CRM_Extension_Exception | \GuzzleHttp\Exception\GuzzleException $e) {
       $messages[] = new CRM_Utils_Check_Message(
         __FUNCTION__,
         $e->getMessage(),