From f77285916a8c0481a57554ad8615a049660e6b9b Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 21 Feb 2019 15:28:50 +0100 Subject: [PATCH] Clean up temp file on curl request failure and make sure the response body is avaiable on 3xx/4xx/5xx responses --- src/Composer/Util/Http/CurlDownloader.php | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/Composer/Util/Http/CurlDownloader.php b/src/Composer/Util/Http/CurlDownloader.php index 1ebc64242..989e63d12 100644 --- a/src/Composer/Util/Http/CurlDownloader.php +++ b/src/Composer/Util/Http/CurlDownloader.php @@ -251,16 +251,20 @@ class CurlDownloader // prepare response object if ($job['filename']) { - fclose($job['bodyHandle']); - $response = new Response(array('url' => $progress['url']), $statusCode, $headers, $job['filename'].'~'); + $contents = $job['filename'].'~'; + if ($statusCode >= 300) { + rewind($job['bodyHandle']); + $contents = stream_get_contents($job['bodyHandle']); + } + $response = new Response(array('url' => $progress['url']), $statusCode, $headers, $contents); $this->io->writeError('['.$statusCode.'] '.$progress['url'], true, IOInterface::DEBUG); } else { rewind($job['bodyHandle']); $contents = stream_get_contents($job['bodyHandle']); - fclose($job['bodyHandle']); $response = new Response(array('url' => $progress['url']), $statusCode, $headers, $contents); $this->io->writeError('['.$statusCode.'] '.$progress['url'], true, IOInterface::DEBUG); } + fclose($job['bodyHandle']); if ($response->getStatusCode() >= 400 && $response->getHeader('content-type') === 'application/json') { HttpDownloader::outputWarnings($this->io, $job['origin'], json_decode($response->getBody(), true)); @@ -268,10 +272,6 @@ class CurlDownloader $result = $this->isAuthenticatedRetryNeeded($job, $response); if ($result['retry']) { - if ($job['filename']) { - @unlink($job['filename'].'~'); - } - $this->restartJob($job, $job['url'], array('storeAuth' => $result['storeAuth'])); continue; } @@ -422,6 +422,10 @@ class CurlDownloader private function restartJob(array $job, $url, array $attributes = array()) { + if ($job['filename']) { + @unlink($job['filename'].'~'); + } + $attributes = array_merge($job['attributes'], $attributes); $origin = Url::getOrigin($this->config, $url); @@ -430,6 +434,10 @@ class CurlDownloader private function failResponse(array $job, Response $response, $errorMessage) { + if ($job['filename']) { + @unlink($job['filename'].'~'); + } + return new TransportException('The "'.$job['url'].'" file could not be downloaded ('.$errorMessage.')', $response->getStatusCode()); }