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']);