Move user agent definition to StreamContextFactory so it is available in all contexts

main
Jordi Boggiano 9 years ago
parent 9e9c1917e1
commit fbab2bfa17

@ -449,21 +449,7 @@ class RemoteFilesystem
protected function getOptionsForUrl($originUrl, $additionalOptions) protected function getOptionsForUrl($originUrl, $additionalOptions)
{ {
if (defined('HHVM_VERSION')) { $headers = array();
$phpVersion = 'HHVM ' . HHVM_VERSION;
} else {
$phpVersion = 'PHP ' . PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION . '.' . PHP_RELEASE_VERSION;
}
$headers = array(
sprintf(
'User-Agent: Composer/%s (%s; %s; %s)',
Composer::VERSION === '@package_version@' ? 'source' : Composer::VERSION,
php_uname('s'),
php_uname('r'),
$phpVersion
),
);
if (extension_loaded('zlib')) { if (extension_loaded('zlib')) {
$headers[] = 'Accept-Encoding: gzip'; $headers[] = 'Accept-Encoding: gzip';

@ -12,6 +12,8 @@
namespace Composer\Util; namespace Composer\Util;
use Composer\Composer;
/** /**
* Allows the creation of a basic context supporting http proxy * Allows the creation of a basic context supporting http proxy
* *
@ -127,6 +129,22 @@ final class StreamContextFactory
$options['http']['header'] = self::fixHttpHeaderField($options['http']['header']); $options['http']['header'] = self::fixHttpHeaderField($options['http']['header']);
} }
if (defined('HHVM_VERSION')) {
$phpVersion = 'HHVM ' . HHVM_VERSION;
} else {
$phpVersion = 'PHP ' . PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION . '.' . PHP_RELEASE_VERSION;
}
if (!isset($options['http']['header']) || false === strpos(strtolower(implode('', $options['http']['header'])), 'user-agent')) {
$options['http']['header'][] = sprintf(
'User-Agent: Composer/%s (%s; %s; %s)',
Composer::VERSION === '@package_version@' ? 'source' : Composer::VERSION,
php_uname('s'),
php_uname('r'),
$phpVersion
);
}
return stream_context_create($options, $defaultParams); return stream_context_create($options, $defaultParams);
} }

@ -27,14 +27,6 @@ class RemoteFilesystemTest extends \PHPUnit_Framework_TestCase
$res = $this->callGetOptionsForUrl($io, array('http://example.org', array())); $res = $this->callGetOptionsForUrl($io, array('http://example.org', array()));
$this->assertTrue(isset($res['http']['header']) && is_array($res['http']['header']), 'getOptions must return an array with headers'); $this->assertTrue(isset($res['http']['header']) && is_array($res['http']['header']), 'getOptions must return an array with headers');
$found = false;
foreach ($res['http']['header'] as $header) {
if (0 === strpos($header, 'User-Agent:')) {
$found = true;
}
}
$this->assertTrue($found, 'getOptions must have a User-Agent header');
} }
public function testGetOptionsForUrlWithAuthorization() public function testGetOptionsForUrlWithAuthorization()

@ -51,11 +51,11 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
{ {
return array( return array(
array( array(
$a = array('http' => array('follow_location' => 1, 'max_redirects' => 20)), array(), $a = array('http' => array('follow_location' => 1, 'max_redirects' => 20, 'header' => array('User-Agent: foo'))), array('http' => array('header' => 'User-Agent: foo')),
array('options' => $a), array(), array('options' => $a), array(),
), ),
array( array(
$a = array('http' => array('method' => 'GET', 'max_redirects' => 20, 'follow_location' => 1)), array('http' => array('method' => 'GET')), $a = array('http' => array('method' => 'GET', 'max_redirects' => 20, 'follow_location' => 1, 'header' => array('User-Agent: foo'))), array('http' => array('method' => 'GET', 'header' => 'User-Agent: foo')),
array('options' => $a, 'notification' => $f = function () {}), array('notification' => $f), array('options' => $a, 'notification' => $f = function () {}), array('notification' => $f),
), ),
); );
@ -66,14 +66,14 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
$_SERVER['http_proxy'] = 'http://username:p%40ssword@proxyserver.net:3128/'; $_SERVER['http_proxy'] = 'http://username:p%40ssword@proxyserver.net:3128/';
$_SERVER['HTTP_PROXY'] = 'http://proxyserver/'; $_SERVER['HTTP_PROXY'] = 'http://proxyserver/';
$context = StreamContextFactory::getContext('http://example.org', array('http' => array('method' => 'GET'))); $context = StreamContextFactory::getContext('http://example.org', array('http' => array('method' => 'GET', 'header' => 'User-Agent: foo')));
$options = stream_context_get_options($context); $options = stream_context_get_options($context);
$this->assertEquals(array('http' => array( $this->assertEquals(array('http' => array(
'proxy' => 'tcp://proxyserver.net:3128', 'proxy' => 'tcp://proxyserver.net:3128',
'request_fulluri' => true, 'request_fulluri' => true,
'method' => 'GET', 'method' => 'GET',
'header' => array("Proxy-Authorization: Basic " . base64_encode('username:p@ssword')), 'header' => array('User-Agent: foo', "Proxy-Authorization: Basic " . base64_encode('username:p@ssword')),
'max_redirects' => 20, 'max_redirects' => 20,
'follow_location' => 1, 'follow_location' => 1,
)), $options); )), $options);
@ -84,13 +84,14 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
$_SERVER['http_proxy'] = 'http://username:password@proxyserver.net:3128/'; $_SERVER['http_proxy'] = 'http://username:password@proxyserver.net:3128/';
$_SERVER['no_proxy'] = 'foo,example.org'; $_SERVER['no_proxy'] = 'foo,example.org';
$context = StreamContextFactory::getContext('http://example.org', array('http' => array('method' => 'GET'))); $context = StreamContextFactory::getContext('http://example.org', array('http' => array('method' => 'GET', 'header' => 'User-Agent: foo')));
$options = stream_context_get_options($context); $options = stream_context_get_options($context);
$this->assertEquals(array('http' => array( $this->assertEquals(array('http' => array(
'method' => 'GET', 'method' => 'GET',
'max_redirects' => 20, 'max_redirects' => 20,
'follow_location' => 1, 'follow_location' => 1,
'header' => array('User-Agent: foo'),
)), $options); )), $options);
} }
@ -99,13 +100,14 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
$_SERVER['http_proxy'] = 'http://username:password@proxyserver.net:3128/'; $_SERVER['http_proxy'] = 'http://username:password@proxyserver.net:3128/';
$_SERVER['no_proxy'] = '*'; $_SERVER['no_proxy'] = '*';
$context = StreamContextFactory::getContext('http://example.org', array('http' => array('method' => 'GET'))); $context = StreamContextFactory::getContext('http://example.org', array('http' => array('method' => 'GET', 'header' => 'User-Agent: foo')));
$options = stream_context_get_options($context); $options = stream_context_get_options($context);
$this->assertEquals(array('http' => array( $this->assertEquals(array('http' => array(
'method' => 'GET', 'method' => 'GET',
'max_redirects' => 20, 'max_redirects' => 20,
'follow_location' => 1, 'follow_location' => 1,
'header' => array('User-Agent: foo'),
)), $options); )), $options);
} }
@ -113,14 +115,14 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
{ {
$_SERVER['http_proxy'] = 'http://username:password@proxyserver.net:3128/'; $_SERVER['http_proxy'] = 'http://username:password@proxyserver.net:3128/';
$context = StreamContextFactory::getContext('http://example.org', array('http' => array('method' => 'GET', 'header' => array("X-Foo: bar"), 'request_fulluri' => false))); $context = StreamContextFactory::getContext('http://example.org', array('http' => array('method' => 'GET', 'header' => array('User-Agent: foo', "X-Foo: bar"), 'request_fulluri' => false)));
$options = stream_context_get_options($context); $options = stream_context_get_options($context);
$this->assertEquals(array('http' => array( $this->assertEquals(array('http' => array(
'proxy' => 'tcp://proxyserver.net:3128', 'proxy' => 'tcp://proxyserver.net:3128',
'request_fulluri' => false, 'request_fulluri' => false,
'method' => 'GET', 'method' => 'GET',
'header' => array("X-Foo: bar", "Proxy-Authorization: Basic " . base64_encode('username:password')), 'header' => array('User-Agent: foo', "X-Foo: bar", "Proxy-Authorization: Basic " . base64_encode('username:password')),
'max_redirects' => 20, 'max_redirects' => 20,
'follow_location' => 1, 'follow_location' => 1,
)), $options); )), $options);
@ -130,7 +132,7 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
{ {
$_SERVER['http_proxy'] = 'http://username:password@proxyserver.net'; $_SERVER['http_proxy'] = 'http://username:password@proxyserver.net';
$context = StreamContextFactory::getContext('https://example.org', array('http' => array('method' => 'GET'))); $context = StreamContextFactory::getContext('https://example.org', array('http' => array('method' => 'GET', 'header' => 'User-Agent: foo')));
$options = stream_context_get_options($context); $options = stream_context_get_options($context);
$expected = array( $expected = array(
@ -138,7 +140,7 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
'proxy' => 'tcp://proxyserver.net:80', 'proxy' => 'tcp://proxyserver.net:80',
'request_fulluri' => true, 'request_fulluri' => true,
'method' => 'GET', 'method' => 'GET',
'header' => array("Proxy-Authorization: Basic " . base64_encode('username:password')), 'header' => array('User-Agent: foo', "Proxy-Authorization: Basic " . base64_encode('username:password')),
'max_redirects' => 20, 'max_redirects' => 20,
'follow_location' => 1, 'follow_location' => 1,
), 'ssl' => array( ), 'ssl' => array(
@ -161,7 +163,7 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
$_SERVER['http_proxy'] = 'http://username:password@proxyserver.net'; $_SERVER['http_proxy'] = 'http://username:password@proxyserver.net';
$_SERVER['https_proxy'] = 'https://woopproxy.net'; $_SERVER['https_proxy'] = 'https://woopproxy.net';
$context = StreamContextFactory::getContext('https://example.org', array('http' => array('method' => 'GET'))); $context = StreamContextFactory::getContext('https://example.org', array('http' => array('method' => 'GET', 'header' => 'User-Agent: foo')));
$options = stream_context_get_options($context); $options = stream_context_get_options($context);
$expected = array( $expected = array(
@ -171,6 +173,7 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
'method' => 'GET', 'method' => 'GET',
'max_redirects' => 20, 'max_redirects' => 20,
'follow_location' => 1, 'follow_location' => 1,
'header' => array('User-Agent: foo'),
), 'ssl' => array( ), 'ssl' => array(
'SNI_enabled' => true, 'SNI_enabled' => true,
'SNI_server_name' => 'example.org', 'SNI_server_name' => 'example.org',
@ -190,7 +193,7 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
$_SERVER['http_proxy'] = $proxy; $_SERVER['http_proxy'] = $proxy;
if (extension_loaded('openssl')) { if (extension_loaded('openssl')) {
$context = StreamContextFactory::getContext('http://example.org'); $context = StreamContextFactory::getContext('http://example.org', array('http' => array('header' => 'User-Agent: foo')));
$options = stream_context_get_options($context); $options = stream_context_get_options($context);
$this->assertEquals(array('http' => array( $this->assertEquals(array('http' => array(
@ -198,6 +201,7 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
'request_fulluri' => true, 'request_fulluri' => true,
'max_redirects' => 20, 'max_redirects' => 20,
'follow_location' => 1, 'follow_location' => 1,
'header' => array('User-Agent: foo'),
)), $options); )), $options);
} else { } else {
try { try {
@ -221,12 +225,13 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
{ {
$options = array( $options = array(
'http' => array( 'http' => array(
'header' => "X-Foo: bar\r\nContent-Type: application/json\r\nAuthorization: Basic aW52YWxpZA==", 'header' => "User-agent: foo\r\nX-Foo: bar\r\nContent-Type: application/json\r\nAuthorization: Basic aW52YWxpZA==",
), ),
); );
$expectedOptions = array( $expectedOptions = array(
'http' => array( 'http' => array(
'header' => array( 'header' => array(
"User-agent: foo",
"X-Foo: bar", "X-Foo: bar",
"Authorization: Basic aW52YWxpZA==", "Authorization: Basic aW52YWxpZA==",
"Content-Type: application/json", "Content-Type: application/json",
@ -235,6 +240,6 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
); );
$context = StreamContextFactory::getContext('http://example.org', $options); $context = StreamContextFactory::getContext('http://example.org', $options);
$ctxoptions = stream_context_get_options($context); $ctxoptions = stream_context_get_options($context);
$this->assertEquals(end($ctxoptions['http']['header']), end($expectedOptions['http']['header'])); $this->assertEquals(end($expectedOptions['http']['header']), end($ctxoptions['http']['header']));
} }
} }

Loading…
Cancel
Save