public function __invoke()

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);
    }