From 9ba042ded8b26230d33ebceb692bf29111d51ba4 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 20 May 2021 10:17:30 +0200 Subject: [PATCH] Add Platform-PHP version to user-agent header to improve targetted-php stats (#9873) --- .../Repository/PlatformRepository.php | 23 +++++++++++++++++++ src/Composer/Util/StreamContextFactory.php | 5 +++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/Composer/Repository/PlatformRepository.php b/src/Composer/Repository/PlatformRepository.php index 7e48b49b5..3b08b3e2c 100644 --- a/src/Composer/Repository/PlatformRepository.php +++ b/src/Composer/Repository/PlatformRepository.php @@ -33,6 +33,11 @@ class PlatformRepository extends ArrayRepository { const PLATFORM_PACKAGE_REGEX = '{^(?:php(?:-64bit|-ipv6|-zts|-debug)?|hhvm|(?:ext|lib)-[a-z0-9](?:[_.-]?[a-z0-9]+)*|composer-(?:plugin|runtime)-api)$}iD'; + /** + * @var ?string + */ + private static $lastSeenPlatformPhp = null; + /** * @var VersionParser */ @@ -526,6 +531,10 @@ class PlatformRepository extends ArrayRepository $package->setExtra(array('config.platform' => true)); parent::addPackage($package); + if ($package->getName() === 'php') { + self::$lastSeenPlatformPhp = implode('.', array_slice(explode('.', $package->getVersion()), 0, 3)); + } + return $package; } @@ -620,4 +629,18 @@ class PlatformRepository extends ArrayRepository return $cache[$name] = (bool) preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $name); } + + /** + * Returns the last seen config.platform.php version if defined + * + * This is a best effort attempt for internal purposes, retrieve the real + * packages from a PlatformRepository instance if you need a version guaranteed to + * be correct. + * + * @internal + */ + public static function getPlatformPhpVersion() + { + return self::$lastSeenPlatformPhp; + } } diff --git a/src/Composer/Util/StreamContextFactory.php b/src/Composer/Util/StreamContextFactory.php index 3545db105..3542d55ed 100644 --- a/src/Composer/Util/StreamContextFactory.php +++ b/src/Composer/Util/StreamContextFactory.php @@ -15,6 +15,7 @@ namespace Composer\Util; use Composer\Composer; use Composer\CaBundle\CaBundle; use Composer\Downloader\TransportException; +use Composer\Repository\PlatformRepository; use Composer\Util\Http\ProxyManager; use Psr\Log\LoggerInterface; @@ -112,13 +113,15 @@ final class StreamContextFactory } if (!isset($options['http']['header']) || false === stripos(implode('', $options['http']['header']), 'user-agent')) { + $platformPhpVersion = PlatformRepository::getPlatformPhpVersion(); $options['http']['header'][] = sprintf( - 'User-Agent: Composer/%s (%s; %s; %s; %s%s)', + 'User-Agent: Composer/%s (%s; %s; %s; %s%s%s)', Composer::getVersion(), function_exists('php_uname') ? php_uname('s') : 'Unknown', function_exists('php_uname') ? php_uname('r') : 'Unknown', $phpVersion, $httpVersion, + $platformPhpVersion ? '; Platform-PHP '.$platformPhpVersion : '', getenv('CI') ? '; CI' : '' ); }