// timeout for when the connection or the server is slow
const CHECK_TIMEOUT = 5;
+ /**
+ * @var GuzzleHttp\Client
+ */
+ protected $guzzleClient;
+
+ /**
+ * @return \GuzzleHttp\Client
+ */
+ public function getGuzzleClient(): \GuzzleHttp\Client {
+ return $this->guzzleClient ?? new \GuzzleHttp\Client();
+ }
+
+ /**
+ * @param \GuzzleHttp\Client $guzzleClient
+ */
+ public function setGuzzleClient(\GuzzleHttp\Client $guzzleClient) {
+ $this->guzzleClient = $guzzleClient;
+ }
+
/**
* @param string $repoUrl
* URL of the remote repository.
/**
* Get a list of all available extensions.
*
- * @return array
+ * @return CRM_Extension_Info[]
* ($key => CRM_Extension_Info)
*/
public function getExtensions() {
}
/**
- * @return array
+ * @return CRM_Extension_Info[]
* @throws CRM_Extension_Exception_ParseException
*/
private function _discoverRemote() {
* @throws \CRM_Extension_Exception
*/
private function grabRemoteJson() {
-
- ini_set('default_socket_timeout', self::CHECK_TIMEOUT);
set_error_handler(array('CRM_Extension_Browser', 'downloadError'));
- if (!ini_get('allow_url_fopen')) {
- ini_set('allow_url_fopen', 1);
- }
-
if (FALSE === $this->getRepositoryUrl()) {
// don't check if the user has configured civi not to check an external
// url for extensions. See CRM-10575.
- return [];
+ return '';
}
$filename = $this->cacheDir . DIRECTORY_SEPARATOR . self::CACHE_JSON_FILE . '.' . md5($this->getRepositoryUrl());
$url = $this->getRepositoryUrl() . $this->indexPath;
- $status = CRM_Utils_HttpClient::singleton()->fetch($url, $filename);
-
- ini_restore('allow_url_fopen');
- ini_restore('default_socket_timeout');
+ $client = $this->getGuzzleClient();
+ $response = $client->request('GET', $url, ['sink' => $filename, 'timeout' => \Civi::settings()->get('http_timeout')]);
restore_error_handler();
- if ($status !== CRM_Utils_HttpClient::STATUS_OK) {
- throw new CRM_Extension_Exception(ts('The CiviCRM public extensions directory at %1 could not be contacted - please check your webserver can make external HTTP requests or contact CiviCRM team on <a href="http://forum.civicrm.org/">CiviCRM forum</a>.', array(1 => $this->getRepositoryUrl())), 'connection_error');
+ if ($response->getStatusCode() !== 200) {
+ throw new CRM_Extension_Exception(ts('The CiviCRM public extensions directory at %1 could not be contacted - please check your webserver can make external HTTP requests', [1 => $this->getRepositoryUrl()]), 'connection_error');
}
// Don't call grabCachedJson here, that would risk infinite recursion