From 370e082b4a981c2f2a3ccbeed56476effc67c0be Mon Sep 17 00:00:00 2001 From: Wissem Riahi Date: Wed, 6 Jan 2021 16:05:00 +0100 Subject: [PATCH 1/4] Add saving time duration for curl HTTP requests --- src/Composer/Downloader/TransportException.php | 11 +++++++++++ src/Composer/Util/Http/CurlDownloader.php | 7 ++++++- src/Composer/Util/Http/Response.php | 15 +++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/Composer/Downloader/TransportException.php b/src/Composer/Downloader/TransportException.php index c682df080..b46f22e4c 100644 --- a/src/Composer/Downloader/TransportException.php +++ b/src/Composer/Downloader/TransportException.php @@ -20,6 +20,7 @@ class TransportException extends \RuntimeException protected $headers; protected $response; protected $statusCode; + protected $totalResponseTime; public function setHeaders($headers) { @@ -50,4 +51,14 @@ class TransportException extends \RuntimeException { return $this->statusCode; } + + public function getTotalResponseTime() + { + return $this->totalResponseTime; + } + + public function setTotalResponseTime($totalResponseTime) + { + $this->totalResponseTime = $totalResponseTime; + } } diff --git a/src/Composer/Util/Http/CurlDownloader.php b/src/Composer/Util/Http/CurlDownloader.php index 5345f5ce3..96d20eab7 100644 --- a/src/Composer/Util/Http/CurlDownloader.php +++ b/src/Composer/Util/Http/CurlDownloader.php @@ -303,7 +303,10 @@ class CurlDownloader if (!$error && function_exists('curl_strerror')) { $error = curl_strerror($errno); } - throw new TransportException('curl error '.$errno.' while downloading '.Url::sanitize($progress['url']).': '.$error); + + $exception = new TransportException('curl error '.$errno.' while downloading '.Url::sanitize($progress['url']).': '.$error); + $exception->setTotalResponseTime($progress['total_time_us']); + throw $exception; } $statusCode = $progress['http_code']; rewind($job['headerHandle']); @@ -322,11 +325,13 @@ class CurlDownloader $contents = stream_get_contents($job['bodyHandle']); } $response = new Response(array('url' => $progress['url']), $statusCode, $headers, $contents); + $response->setTotalResponseTime($progress['total_time_us']); $this->io->writeError('['.$statusCode.'] '.Url::sanitize($progress['url']), true, IOInterface::DEBUG); } else { rewind($job['bodyHandle']); $contents = stream_get_contents($job['bodyHandle']); $response = new Response(array('url' => $progress['url']), $statusCode, $headers, $contents); + $response->setTotalResponseTime($progress['total_time_us']); $this->io->writeError('['.$statusCode.'] '.Url::sanitize($progress['url']), true, IOInterface::DEBUG); } fclose($job['bodyHandle']); diff --git a/src/Composer/Util/Http/Response.php b/src/Composer/Util/Http/Response.php index 29dd934d5..743ab68f3 100644 --- a/src/Composer/Util/Http/Response.php +++ b/src/Composer/Util/Http/Response.php @@ -20,6 +20,7 @@ class Response private $code; private $headers; private $body; + private $totalResponseTime; public function __construct(array $request, $code, array $headers, $body) { @@ -69,6 +70,20 @@ class Response return $this->body; } + /** + * Total duration time it took for the response in micro seconds + * @return int|null + */ + public function getTotalResponseTime() + { + return $this->totalResponseTime; + } + + public function setTotalResponseTime($totalResponseTime) + { + $this->totalResponseTime = $totalResponseTime; + } + public function decodeJson() { return JsonFile::parseJson($this->body, $this->request['url']); From a5d79db0a70cfd6109f3bdbc9caf6346bc326cf9 Mon Sep 17 00:00:00 2001 From: Wissem Riahi Date: Wed, 6 Jan 2021 18:00:48 +0100 Subject: [PATCH 2/4] Make sure total_time_us from curl progress is set --- src/Composer/Util/Http/CurlDownloader.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Composer/Util/Http/CurlDownloader.php b/src/Composer/Util/Http/CurlDownloader.php index 96d20eab7..ecc46bc70 100644 --- a/src/Composer/Util/Http/CurlDownloader.php +++ b/src/Composer/Util/Http/CurlDownloader.php @@ -305,7 +305,7 @@ class CurlDownloader } $exception = new TransportException('curl error '.$errno.' while downloading '.Url::sanitize($progress['url']).': '.$error); - $exception->setTotalResponseTime($progress['total_time_us']); + $exception->setTotalResponseTime(isset($progress['total_time_us']) ? $progress['total_time_us'] : null); throw $exception; } $statusCode = $progress['http_code']; @@ -325,13 +325,13 @@ class CurlDownloader $contents = stream_get_contents($job['bodyHandle']); } $response = new Response(array('url' => $progress['url']), $statusCode, $headers, $contents); - $response->setTotalResponseTime($progress['total_time_us']); + $response->setTotalResponseTime(isset($progress['total_time_us']) ? $progress['total_time_us'] : null); $this->io->writeError('['.$statusCode.'] '.Url::sanitize($progress['url']), true, IOInterface::DEBUG); } else { rewind($job['bodyHandle']); $contents = stream_get_contents($job['bodyHandle']); $response = new Response(array('url' => $progress['url']), $statusCode, $headers, $contents); - $response->setTotalResponseTime($progress['total_time_us']); + $response->setTotalResponseTime(isset($progress['total_time_us']) ? $progress['total_time_us'] : null); $this->io->writeError('['.$statusCode.'] '.Url::sanitize($progress['url']), true, IOInterface::DEBUG); } fclose($job['bodyHandle']); From bdecb4711d9afd317c38110fdd7228b0efcc55e7 Mon Sep 17 00:00:00 2001 From: Wissem Riahi Date: Thu, 7 Jan 2021 12:01:19 +0100 Subject: [PATCH 3/4] Add all curl_getinfo into the response and exception for curl requests --- .../Downloader/TransportException.php | 16 +++++++--- src/Composer/Util/Http/CurlDownloader.php | 9 ++---- src/Composer/Util/Http/CurlResponse.php | 32 +++++++++++++++++++ src/Composer/Util/Http/Response.php | 15 --------- 4 files changed, 46 insertions(+), 26 deletions(-) create mode 100644 src/Composer/Util/Http/CurlResponse.php diff --git a/src/Composer/Downloader/TransportException.php b/src/Composer/Downloader/TransportException.php index b46f22e4c..73454df81 100644 --- a/src/Composer/Downloader/TransportException.php +++ b/src/Composer/Downloader/TransportException.php @@ -20,7 +20,7 @@ class TransportException extends \RuntimeException protected $headers; protected $response; protected $statusCode; - protected $totalResponseTime; + protected $responseInfo; public function setHeaders($headers) { @@ -52,13 +52,19 @@ class TransportException extends \RuntimeException return $this->statusCode; } - public function getTotalResponseTime() + /** + * @return array + */ + public function getResponseInfo() { - return $this->totalResponseTime; + return $this->responseInfo; } - public function setTotalResponseTime($totalResponseTime) + /** + * @param array $responseInfo + */ + public function setResponseInfo($responseInfo) { - $this->totalResponseTime = $totalResponseTime; + $this->responseInfo = $responseInfo; } } diff --git a/src/Composer/Util/Http/CurlDownloader.php b/src/Composer/Util/Http/CurlDownloader.php index ecc46bc70..6f6d69352 100644 --- a/src/Composer/Util/Http/CurlDownloader.php +++ b/src/Composer/Util/Http/CurlDownloader.php @@ -303,9 +303,8 @@ class CurlDownloader if (!$error && function_exists('curl_strerror')) { $error = curl_strerror($errno); } - $exception = new TransportException('curl error '.$errno.' while downloading '.Url::sanitize($progress['url']).': '.$error); - $exception->setTotalResponseTime(isset($progress['total_time_us']) ? $progress['total_time_us'] : null); + $exception->setResponseInfo($progress); throw $exception; } $statusCode = $progress['http_code']; @@ -324,14 +323,12 @@ class CurlDownloader rewind($job['bodyHandle']); $contents = stream_get_contents($job['bodyHandle']); } - $response = new Response(array('url' => $progress['url']), $statusCode, $headers, $contents); - $response->setTotalResponseTime(isset($progress['total_time_us']) ? $progress['total_time_us'] : null); + $response = new CurlResponse(array('url' => $progress['url']), $statusCode, $headers, $contents, $progress); $this->io->writeError('['.$statusCode.'] '.Url::sanitize($progress['url']), true, IOInterface::DEBUG); } else { rewind($job['bodyHandle']); $contents = stream_get_contents($job['bodyHandle']); - $response = new Response(array('url' => $progress['url']), $statusCode, $headers, $contents); - $response->setTotalResponseTime(isset($progress['total_time_us']) ? $progress['total_time_us'] : null); + $response = new CurlResponse(array('url' => $progress['url']), $statusCode, $headers, $contents, $progress); $this->io->writeError('['.$statusCode.'] '.Url::sanitize($progress['url']), true, IOInterface::DEBUG); } fclose($job['bodyHandle']); diff --git a/src/Composer/Util/Http/CurlResponse.php b/src/Composer/Util/Http/CurlResponse.php new file mode 100644 index 000000000..82f725266 --- /dev/null +++ b/src/Composer/Util/Http/CurlResponse.php @@ -0,0 +1,32 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Util\Http; + +class CurlResponse extends Response +{ + private $curlInfo; + + public function __construct(array $request, $code, array $headers, $body, array $curlInfo) + { + parent::__construct($request, $code, $headers, $body); + $this->curlInfo = $curlInfo; + } + + /** + * @return array + */ + public function getCurlInfo() + { + return $this->curlInfo; + } +} diff --git a/src/Composer/Util/Http/Response.php b/src/Composer/Util/Http/Response.php index 743ab68f3..29dd934d5 100644 --- a/src/Composer/Util/Http/Response.php +++ b/src/Composer/Util/Http/Response.php @@ -20,7 +20,6 @@ class Response private $code; private $headers; private $body; - private $totalResponseTime; public function __construct(array $request, $code, array $headers, $body) { @@ -70,20 +69,6 @@ class Response return $this->body; } - /** - * Total duration time it took for the response in micro seconds - * @return int|null - */ - public function getTotalResponseTime() - { - return $this->totalResponseTime; - } - - public function setTotalResponseTime($totalResponseTime) - { - $this->totalResponseTime = $totalResponseTime; - } - public function decodeJson() { return JsonFile::parseJson($this->body, $this->request['url']); From 7f8536711367480facfd00d236422ae2c46c963a Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 7 Jan 2021 23:26:29 +0100 Subject: [PATCH 4/4] Make sure an array is always returned --- src/Composer/Downloader/TransportException.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Composer/Downloader/TransportException.php b/src/Composer/Downloader/TransportException.php index 73454df81..68c73542f 100644 --- a/src/Composer/Downloader/TransportException.php +++ b/src/Composer/Downloader/TransportException.php @@ -20,7 +20,7 @@ class TransportException extends \RuntimeException protected $headers; protected $response; protected $statusCode; - protected $responseInfo; + protected $responseInfo = array(); public function setHeaders($headers) { @@ -63,7 +63,7 @@ class TransportException extends \RuntimeException /** * @param array $responseInfo */ - public function setResponseInfo($responseInfo) + public function setResponseInfo(array $responseInfo) { $this->responseInfo = $responseInfo; }