in src/Glacier/GlacierClient.php [122:186]
private function getChecksumsMiddleware()
{
return function (callable $handler) {
return function (
CommandInterface $command,
?RequestInterface $request = null
) use ($handler) {
// Accept "ContentSHA256" with a lowercase "c" to match other Glacier params.
if (!$command['ContentSHA256'] && $command['contentSHA256']) {
$command['ContentSHA256'] = $command['contentSHA256'];
unset($command['contentSHA256']);
}
// If uploading, then make sure checksums are added.
$name = $command->getName();
if (($name === 'UploadArchive' || $name === 'UploadMultipartPart')
&& (!$command['checksum'] || !$command['ContentSHA256'])
) {
$body = $request->getBody();
if (!$body->isSeekable()) {
throw new CouldNotCreateChecksumException('sha256');
}
// Add a tree hash if not provided.
if (!$command['checksum']) {
$body = new HashingStream(
$body, new TreeHash(),
function ($result) use (&$request) {
$request = $request->withHeader(
'x-amz-sha256-tree-hash',
bin2hex($result)
);
}
);
}
// Add a linear content hash if not provided.
if (!$command['ContentSHA256']) {
$body = new HashingStream(
$body, new PhpHash('sha256'),
function ($result) use ($command) {
$command['ContentSHA256'] = bin2hex($result);
}
);
}
// Read the stream in order to calculate the hashes.
while (!$body->eof()) {
$body->read(1048576);
}
$body->seek(0);
}
// Set the content hash header if a value is in the command.
if ($command['ContentSHA256']) {
$request = $request->withHeader(
'x-amz-content-sha256',
$command['ContentSHA256']
);
}
return $handler($command, $request);
};
};
}