Fix abort of downloads and zip extraction to happen immediately, fixes #9390

main
Jordi Boggiano 3 years ago
parent b724adde10
commit f37f3dab04
No known key found for this signature in database
GPG Key ID: 7BBD42C429EC80BC

@ -16,6 +16,7 @@ use Composer\Config;
use Composer\Cache; use Composer\Cache;
use Composer\IO\IOInterface; use Composer\IO\IOInterface;
use Composer\IO\NullIO; use Composer\IO\NullIO;
use Composer\Exception\IrrecoverableDownloadException;
use Composer\Package\Comparer\Comparer; use Composer\Package\Comparer\Comparer;
use Composer\DependencyResolver\Operation\UpdateOperation; use Composer\DependencyResolver\Operation\UpdateOperation;
use Composer\DependencyResolver\Operation\InstallOperation; use Composer\DependencyResolver\Operation\InstallOperation;
@ -219,6 +220,10 @@ class FileDownloader implements DownloaderInterface, ChangeReportInterface
} }
$self->clearLastCacheWrite($package); $self->clearLastCacheWrite($package);
if ($e instanceof IrrecoverableDownloadException) {
throw $e;
}
if ($e instanceof TransportException) { if ($e instanceof TransportException) {
// if we got an http response with a proper code, then requesting again will probably not help, abort // if we got an http response with a proper code, then requesting again will probably not help, abort
if ((0 !== $e->getCode() && !in_array($e->getCode(), array(500, 502, 503, 504))) || !$retries) { if ((0 !== $e->getCode() && !in_array($e->getCode(), array(500, 502, 503, 504))) || !$retries) {

@ -19,6 +19,7 @@ use Composer\Util\Http\Response;
use Composer\Composer; use Composer\Composer;
use Composer\Package\Version\VersionParser; use Composer\Package\Version\VersionParser;
use Composer\Semver\Constraint\Constraint; use Composer\Semver\Constraint\Constraint;
use Composer\Exception\IrrecoverableDownloadException;
use React\Promise\Promise; use React\Promise\Promise;
/** /**
@ -257,10 +258,11 @@ class HttpDownloader
if (isset($job['curl_id'])) { if (isset($job['curl_id'])) {
$curl->abortRequest($job['curl_id']); $curl->abortRequest($job['curl_id']);
} }
throw new IrrecoverableDownloadException('Download of ' . Url::sanitize($job['request']['url']) . ' canceled');
}; };
$promise = new Promise($resolver, $canceler); $promise = new Promise($resolver, $canceler);
$promise->then(function ($response) use (&$job, $downloader) { $promise = $promise->then(function ($response) use (&$job, $downloader) {
$job['status'] = HttpDownloader::STATUS_COMPLETED; $job['status'] = HttpDownloader::STATUS_COMPLETED;
$job['response'] = $response; $job['response'] = $response;
@ -306,7 +308,7 @@ class HttpDownloader
if (isset($job['request']['options']['http']['header']) && false !== stripos(implode('', $job['request']['options']['http']['header']), 'if-modified-since')) { if (isset($job['request']['options']['http']['header']) && false !== stripos(implode('', $job['request']['options']['http']['header']), 'if-modified-since')) {
$resolve(new Response(array('url' => $url), 304, array(), '')); $resolve(new Response(array('url' => $url), 304, array(), ''));
} else { } else {
$e = new TransportException('Network disabled, request canceled: '.$url, 499); $e = new TransportException('Network disabled, request canceled: '.Url::sanitize($url), 499);
$e->setStatusCode(499); $e->setStatusCode(499);
$reject($e); $reject($e);
} }
@ -429,7 +431,7 @@ class HttpDownloader
} }
} }
$io->writeError('<'.$type.'>'.ucfirst($type).' from '.$url.': '.$data[$type].'</'.$type.'>'); $io->writeError('<'.$type.'>'.ucfirst($type).' from '.Url::sanitize($url).': '.$data[$type].'</'.$type.'>');
} }
} }

@ -177,6 +177,8 @@ class ProcessExecutor
// signal can throw in various conditions, but we don't care if it fails // signal can throw in various conditions, but we don't care if it fails
} }
$job['process']->stop(1); $job['process']->stop(1);
throw new \RuntimeException('Aborted process');
}; };
$promise = new Promise($resolver, $canceler); $promise = new Promise($resolver, $canceler);

Loading…
Cancel
Save