diff --git a/src/Composer/Util/StreamContextFactory.php b/src/Composer/Util/StreamContextFactory.php index e62bb7e52..781fda6ae 100644 --- a/src/Composer/Util/StreamContextFactory.php +++ b/src/Composer/Util/StreamContextFactory.php @@ -58,7 +58,7 @@ final class StreamContextFactory /** * @param string $url * @param array $options - * @param bool $forCurl + * @param bool $forCurl When true, will not add proxy values as these are handled separately * @psalm-return array{http:{header: string[], proxy?: string, request_fulluri: bool}, ssl: array} * @return array formatted as a stream context array */ @@ -75,13 +75,17 @@ final class StreamContextFactory // Add stream proxy options if there is a proxy if (!$forCurl) { $proxy = ProxyManager::getInstance()->getProxyForRequest($url); + $isHttpsRequest = 0 === strpos($url, 'https://'); + if ($proxy->isSecure()) { if (!extension_loaded('openssl')) { - throw new TransportException('You must enable the openssl extension to use a proxy over https.'); + throw new TransportException('You must enable the openssl extension to use a secure proxy.'); } - if (0 === strpos($url, 'https://')) { - throw new TransportException('PHP does not support https requests to a secure proxy.'); + if ($isHttpsRequest) { + throw new TransportException('You must enable the curl extension to make https requests through a secure proxy.'); } + } elseif ($isHttpsRequest && !extension_loaded('openssl')) { + throw new TransportException('You must enable the openssl extension to make https requests through a proxy.'); } $proxyOptions = $proxy->getContextOptions(); diff --git a/tests/Composer/Test/Util/StreamContextFactoryTest.php b/tests/Composer/Test/Util/StreamContextFactoryTest.php index 80423a825..c28b95b1a 100644 --- a/tests/Composer/Test/Util/StreamContextFactoryTest.php +++ b/tests/Composer/Test/Util/StreamContextFactoryTest.php @@ -226,6 +226,10 @@ class StreamContextFactoryTest extends TestCase public function testInitOptionsForCurlDoesNotIncludeProxyAuthHeaders() { + if (!extension_loaded('curl')) { + $this->markTestSkipped('The curl is not available.'); + } + $_SERVER['http_proxy'] = 'http://username:password@proxyserver.net:3128/'; $options = array();