diff --git a/doc/03-cli.md b/doc/03-cli.md index a78c5ed93..7a0c5af2a 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -404,6 +404,12 @@ some tools like git or curl will only use the lower-cased `http_proxy` version. Alternatively you can also define the git proxy using `git config --global http.proxy `. +### HTTP_PROXY_REQUEST_FULLURI + +If you use a proxy but it does not support the request_fulluri flag, then you +should set this env var to `false` or `0` to prevent composer from setting the +request_fulluri option. + ### COMPOSER_HOME The `COMPOSER_HOME` var allows you to change the composer home directory. This diff --git a/src/Composer/Command/DiagnoseCommand.php b/src/Composer/Command/DiagnoseCommand.php index 3a17960ac..07600e0e5 100644 --- a/src/Composer/Command/DiagnoseCommand.php +++ b/src/Composer/Command/DiagnoseCommand.php @@ -56,7 +56,7 @@ EOT if (!empty($opts['http']['proxy'])) { $output->write('Checking HTTP proxy: '); $this->outputResult($output, $this->checkHttpProxy()); - $output->write('Checking HTTPS proxy fullrequest_uri: '); + $output->write('Checking HTTPS proxy support for request_fulluri: '); $this->outputResult($output, $this->checkHttpsProxyFullUriRequestParam()); } @@ -145,31 +145,29 @@ EOT * Due to various proxy servers configurations, some servers cant handle non-standard HTTP "http_proxy_request_fulluri" parameter, * and will return error 500/501 (as not implemented), see discussion @ https://github.com/composer/composer/pull/1825. * This method will test, if you need to disable this parameter via setting extra environment variable in your system. + * * @return bool|string */ private function checkHttpsProxyFullUriRequestParam() { - $protocol = 'https'; - $resultMessage = true; - - /* i've found no better file to test with so far :( */ - $filePath = '://api.github.com/repos/Seldaek/jsonlint/zipball/1.0.0 '; - try - { - $rfcResult = $this->rfs->getContents('api.github.com', $protocol . $filePath, false); - } - catch (TransportException $e) - { - if (!extension_loaded('openssl')) - { - return "Sorry, but you need openssl extension installed for this check - please enable/recompile\n"; + $url = 'https://api.github.com/repos/Seldaek/jsonlint/zipball/1.0.0 '; + try { + $rfcResult = $this->rfs->getContents('api.github.com', $url, false); + } catch (TransportException $e) { + if (!extension_loaded('openssl')) { + return 'You need the openssl extension installed for this check'; } - $this->rfs->getContents('api.github.com', $protocol . $filePath, false, array('http' => array('request_fulluri' => false))); - $resultMessage = "Seems there is a problem with your proxy server, try setting value of your environment variable \"http_proxy_request_fulluri\" to false, and run diagnostics again\n"; + try { + $this->rfs->getContents('api.github.com', $url, false, array('http' => array('request_fulluri' => false))); + } catch (TransportException $e) { + return 'Unable to assert the situation, maybe github is down ('.$e->getMessage().')'; + } + + return 'It seems there is a problem with your proxy server, try setting the "HTTP_PROXY_REQUEST_FULLURI" environment variable to "false"'; } - return $resultMessage; + return true; } private function checkGithubOauth($domain, $token) diff --git a/src/Composer/Util/StreamContextFactory.php b/src/Composer/Util/StreamContextFactory.php index 11f3ea283..d89b115f6 100644 --- a/src/Composer/Util/StreamContextFactory.php +++ b/src/Composer/Util/StreamContextFactory.php @@ -62,13 +62,11 @@ final class StreamContextFactory } $options['http']['proxy'] = $proxyURL; - $options['http']['request_fulluri'] = true; - if ( strtolower( getenv('http_proxy_request_fulluri') ) == 'false' || - strtolower( getenv('HTTP_PROXY_REQUEST_FULLURI') ) == 'false' - ) - { - $options['http']['request_fulluri'] = false; + // enabled request_fulluri unless it is explicitly disabled + $reqFullUriEnv = getenv('HTTP_PROXY_REQUEST_FULLURI'); + if ($reqFullUriEnv === false || $reqFullUriEnv === '' || (strtolower($reqFullUriEnv) !== 'false' && (bool) $reqFullUriEnv)) { + $options['http']['request_fulluri'] = true; } if (isset($proxy['user'])) {