in src/Copier.php [153:211]
private function doCopy(array &$context): GuzzleHttp\Promise\Promise
{
return GuzzleHttp\Promise\Coroutine::of(function () use (&$context) {
// get object meta
if (!isset($context['meta_prop'])) {
/**
* @var Models\CopyObjectRequest $sourceRequest
*/
$sourceRequest = $context['request'];
$request = new Models\HeadObjectRequest();
Utils::copyRequest($request, $sourceRequest);
if ($sourceRequest->sourceBucket != null) {
$request->bucket = $sourceRequest->sourceBucket;
}
$request->key = $sourceRequest->sourceKey;
$request->versionId = $sourceRequest->sourceVersionId;
yield $this->client->headObjectAsync($request)->then(
function (Models\HeadObjectResult $result) use (&$context) {
$context['total_size'] = $result->contentLength;
$context['meta_prop'] = $result;
},
);
}
self::adjustPartsize($context);
if ($context['total_size'] <= $context['multipart_copy_threshold']) {
yield $this->singleCopy($context);
} else if (self::canUseShallowCopy($context)) {
// Use singleCopy first,
// and then use multipartCopy if you encounter an timeout error
$ctx_errors = [];
yield $this->singleCopy($context)->otherwise(
function ($reason) use (&$ctx_errors) {
$ctx_errors[] = $reason;
},
);
if (!empty($ctx_errors)) {
//TODO yield $this->multipartCopy($context);
throw end($ctx_errors);
}
} else {
yield $this->multipartCopy($context);
}
})->then(
function ($result) use (&$context) {
return $context['copy_result'];
},
function ($reason) use (&$context) {
return GuzzleHttp\Promise\Create::rejectionFor(new Exception\CopyException(
$context['upload_id'] ?? '',
$context['path'] ?? '',
$reason
));
}
);
}