in src/S3/ApplyChecksumMiddleware.php [71:133]
public function __invoke(
CommandInterface $command,
RequestInterface $request
) {
$next = $this->nextHandler;
$name = $command->getName();
$body = $request->getBody();
$operation = $this->api->getOperation($name);
$mode = $this->config['request_checksum_calculation']
?? self::DEFAULT_CALCULATION_MODE;
$command->getMetricsBuilder()->identifyMetricByValueAndAppend(
'request_checksum_calculation',
$mode
);
// Trigger warning if AddContentMD5 is specified for PutObject or UploadPart
$this->handleDeprecatedAddContentMD5($command);
$checksumInfo = $operation['httpChecksum'] ?? [];
$checksumMemberName = $checksumInfo['requestAlgorithmMember'] ?? '';
$checksumMember = !empty($checksumMemberName)
? $operation->getInput()->getMember($checksumMemberName)
: null;
$checksumRequired = $checksumInfo['requestChecksumRequired'] ?? false;
$requestedAlgorithm = $command[$checksumMemberName] ?? null;
$shouldAddChecksum = $this->shouldAddChecksum(
$mode,
$checksumRequired,
$checksumMember,
$requestedAlgorithm
);
if ($shouldAddChecksum) {
if (!$this->hasAlgorithmHeader($request)) {
$supportedAlgorithms = array_map('strtolower', $checksumMember['enum'] ?? []);
$algorithm = $this->determineChecksumAlgorithm(
$supportedAlgorithms,
$requestedAlgorithm,
$checksumMemberName
);
$request = $this->addAlgorithmHeader($algorithm, $request, $body);
$command->getMetricsBuilder()->identifyMetricByValueAndAppend(
'request_checksum',
$algorithm
);
}
}
// Set the content hash header if ContentSHA256 is provided
if (isset(self::$sha256[$name]) && $command['ContentSHA256']) {
$request = $request->withHeader(
'X-Amz-Content-Sha256',
$command['ContentSHA256']
);
$command->getMetricsBuilder()->append(
MetricsBuilder::FLEXIBLE_CHECKSUMS_REQ_SHA256
);
}
return $next($command, $request);
}