diff --git a/src/Composer/Util/StreamContextFactory.php b/src/Composer/Util/StreamContextFactory.php index c0e6a5f25..df61b3c3e 100644 --- a/src/Composer/Util/StreamContextFactory.php +++ b/src/Composer/Util/StreamContextFactory.php @@ -34,21 +34,23 @@ final class StreamContextFactory // Handle system proxy if (isset($_SERVER['HTTP_PROXY']) || isset($_SERVER['http_proxy'])) { // Some systems seem to rely on a lowercased version instead... - $proxy = isset($_SERVER['http_proxy']) ? $_SERVER['http_proxy'] : $_SERVER['HTTP_PROXY']; - - $proxyURL = parse_url($proxy, PHP_URL_SCHEME) . "://"; - $proxyURL .= parse_url($proxy, PHP_URL_HOST); - - $proxyPort = parse_url($proxy, PHP_URL_PORT); - - if (isset($proxyPort)) { - $proxyURL .= ":" . $proxyPort; - } else if ('http://' == substr($proxyURL, 0, 7)) { + $proxy = parse_url(isset($_SERVER['http_proxy']) ? $_SERVER['http_proxy'] : $_SERVER['HTTP_PROXY']); + } else { + $proxy = false; + } + + if (false !== $proxy) { + $proxyURL = (isset($proxy['scheme']) ? $proxy['scheme'] : '') . '://'; + $proxyURL .= isset($proxy['host']) ? $proxy['host'] : ''; + + if (isset($proxy['port'])) { + $proxyURL .= ":" . $proxy['port']; + } elseif ('http://' == substr($proxyURL, 0, 7)) { $proxyURL .= ":80"; - } else if ('https://' == substr($proxyURL, 0, 8)) { + } elseif ('https://' == substr($proxyURL, 0, 8)) { $proxyURL .= ":443"; } - + // http(s):// is not supported in proxy $proxyURL = str_replace(array('http://', 'https://'), array('tcp://', 'ssl://'), $proxyURL); @@ -60,18 +62,14 @@ final class StreamContextFactory 'proxy' => $proxyURL, 'request_fulluri' => true, ); - - // Extract authentication credentials from the proxy url - $user = parse_url($proxy, PHP_URL_USER); - $pass = parse_url($proxy, PHP_URL_PASS); - - if (isset($user)) { - $auth = $user; - if (isset($pass)) { - $auth .= ":{$pass}"; + + if (isset($proxy['user'])) { + $auth = $proxy['user']; + if (isset($proxy['pass'])) { + $auth .= ':' . $proxy['pass']; } $auth = base64_encode($auth); - + // Preserve headers if already set in default options if (isset($defaultOptions['http']['header'])) { $defaultOptions['http']['header'] .= "Proxy-Authorization: Basic {$auth}\r\n"; @@ -80,8 +78,9 @@ final class StreamContextFactory } } } + $options = array_merge_recursive($options, $defaultOptions); - + return stream_context_create($options, $defaultParams); } } diff --git a/tests/Composer/Test/Util/StreamContextFactoryTest.php b/tests/Composer/Test/Util/StreamContextFactoryTest.php index 7fa74e0d9..dc60fe3bb 100644 --- a/tests/Composer/Test/Util/StreamContextFactoryTest.php +++ b/tests/Composer/Test/Util/StreamContextFactoryTest.php @@ -96,7 +96,7 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase if (extension_loaded('openssl')) { $context = StreamContextFactory::getContext(); $options = stream_context_get_options($context); - + $this->assertEquals(array('http' => array( 'proxy' => $expected, 'request_fulluri' => true,