in src/S3/BucketEndpointArnMiddleware.php [74:168]
public function __invoke(CommandInterface $cmd, RequestInterface $req)
{
$nextHandler = $this->nextHandler;
$op = $this->service->getOperation($cmd->getName())->toArray();
if (!empty($op['input']['shape'])) {
$service = $this->service->toArray();
if (!empty($input = $service['shapes'][$op['input']['shape']])) {
foreach ($input['members'] as $key => $member) {
if ($member['shape'] === 'BucketName') {
$arnableKey = $key;
break;
}
}
if (!empty($arnableKey) && ArnParser::isArn($cmd[$arnableKey])) {
try {
// Throw for commands that do not support ARN inputs
if (in_array($cmd->getName(), $this->nonArnableCommands)) {
throw new S3Exception(
'ARN values cannot be used in the bucket field for'
. ' the ' . $cmd->getName() . ' operation.',
$cmd
);
}
if (!$this->isUseEndpointV2) {
$arn = ArnParser::parse($cmd[$arnableKey]);
$partition = $this->validateArn($arn);
$host = $this->generateAccessPointHost($arn, $req);
}
// Remove encoded bucket string from path
$path = $req->getUri()->getPath();
$encoded = rawurlencode($cmd[$arnableKey]);
$len = strlen($encoded) + 1;
if (trim(substr($path, 0, $len), '/') === "{$encoded}") {
$path = substr($path, $len);
if (substr($path, 0, 1) !== "/") {
$path = '/' . $path;
}
}
if (empty($path)) {
$path = '';
}
// Set modified request
if ($this->isUseEndpointV2) {
$req = $req->withUri(
$req->getUri()->withPath($path)
);
goto next;
}
$req = $req->withUri(
$req->getUri()->withPath($path)->withHost($host)
);
// Update signing region based on ARN data if configured to do so
if ($this->config['use_arn_region']->isUseArnRegion()
&& !$this->config['use_fips_endpoint']->isUseFipsEndpoint()
) {
$region = $arn->getRegion();
} else {
$region = $this->region;
}
$endpointData = $partition([
'region' => $region,
'service' => $arn->getService()
]);
$cmd['@context']['signing_region'] = $endpointData['signingRegion'];
// Update signing service for Outposts and Lambda ARNs
if ($arn instanceof OutpostsArnInterface
|| $arn instanceof ObjectLambdaAccessPointArn
) {
$cmd['@context']['signing_service'] = $arn->getService();
}
} catch (InvalidArnException $e) {
// Add context to ARN exception
throw new S3Exception(
'Bucket parameter parsed as ARN and failed with: '
. $e->getMessage(),
$cmd,
[],
$e
);
}
}
}
}
next:
return $nextHandler($cmd, $req);
}