1
0
Fork 0

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

pull/4637/head
Jordi Boggiano 2015-11-23 12:33:50 +00:00
parent 9e9c1917e1
commit fbab2bfa17
4 changed files with 38 additions and 37 deletions

View File

@ -449,21 +449,7 @@ class RemoteFilesystem
protected function getOptionsForUrl($originUrl, $additionalOptions)
{
if (defined('HHVM_VERSION')) {
$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
),
);
$headers = array();
if (extension_loaded('zlib')) {
$headers[] = 'Accept-Encoding: gzip';

View File

@ -12,6 +12,8 @@
namespace Composer\Util;
use Composer\Composer;
/**
* 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']);
}
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);
}

View File

@ -27,14 +27,6 @@ class RemoteFilesystemTest extends \PHPUnit_Framework_TestCase
$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');
$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()

View File

@ -51,11 +51,11 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
{
return 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(
$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),
),
);
@ -66,14 +66,14 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
$_SERVER['http_proxy'] = 'http://username:p%40ssword@proxyserver.net:3128/';
$_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);
$this->assertEquals(array('http' => array(
'proxy' => 'tcp://proxyserver.net:3128',
'request_fulluri' => true,
'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,
'follow_location' => 1,
)), $options);
@ -84,13 +84,14 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
$_SERVER['http_proxy'] = 'http://username:password@proxyserver.net:3128/';
$_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);
$this->assertEquals(array('http' => array(
'method' => 'GET',
'max_redirects' => 20,
'follow_location' => 1,
'header' => array('User-Agent: foo'),
)), $options);
}
@ -99,13 +100,14 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
$_SERVER['http_proxy'] = 'http://username:password@proxyserver.net:3128/';
$_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);
$this->assertEquals(array('http' => array(
'method' => 'GET',
'max_redirects' => 20,
'follow_location' => 1,
'header' => array('User-Agent: foo'),
)), $options);
}
@ -113,14 +115,14 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
{
$_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);
$this->assertEquals(array('http' => array(
'proxy' => 'tcp://proxyserver.net:3128',
'request_fulluri' => false,
'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,
'follow_location' => 1,
)), $options);
@ -130,7 +132,7 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
{
$_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);
$expected = array(
@ -138,7 +140,7 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
'proxy' => 'tcp://proxyserver.net:80',
'request_fulluri' => true,
'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,
'follow_location' => 1,
), 'ssl' => array(
@ -161,7 +163,7 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
$_SERVER['http_proxy'] = 'http://username:password@proxyserver.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);
$expected = array(
@ -171,6 +173,7 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
'method' => 'GET',
'max_redirects' => 20,
'follow_location' => 1,
'header' => array('User-Agent: foo'),
), 'ssl' => array(
'SNI_enabled' => true,
'SNI_server_name' => 'example.org',
@ -190,7 +193,7 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
$_SERVER['http_proxy'] = $proxy;
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);
$this->assertEquals(array('http' => array(
@ -198,6 +201,7 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
'request_fulluri' => true,
'max_redirects' => 20,
'follow_location' => 1,
'header' => array('User-Agent: foo'),
)), $options);
} else {
try {
@ -221,12 +225,13 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
{
$options = 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(
'http' => array(
'header' => array(
"User-agent: foo",
"X-Foo: bar",
"Authorization: Basic aW52YWxpZA==",
"Content-Type: application/json",
@ -235,6 +240,6 @@ class StreamContextFactoryTest extends \PHPUnit_Framework_TestCase
);
$context = StreamContextFactory::getContext('http://example.org', $options);
$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']));
}
}