summaryrefslogtreecommitdiff
path: root/vendor/aws/aws-sdk-php/src/S3/ApplyChecksumMiddleware.php
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2022-11-23 21:14:33 +0300
committerAndrew Dolgov <[email protected]>2022-11-23 21:14:33 +0300
commit0c8af4992cb0f7589dcafaad65ada12753c64594 (patch)
tree18e83d068c3e7dd2499331de977782b382279396 /vendor/aws/aws-sdk-php/src/S3/ApplyChecksumMiddleware.php
initial
Diffstat (limited to 'vendor/aws/aws-sdk-php/src/S3/ApplyChecksumMiddleware.php')
-rw-r--r--vendor/aws/aws-sdk-php/src/S3/ApplyChecksumMiddleware.php117
1 files changed, 117 insertions, 0 deletions
diff --git a/vendor/aws/aws-sdk-php/src/S3/ApplyChecksumMiddleware.php b/vendor/aws/aws-sdk-php/src/S3/ApplyChecksumMiddleware.php
new file mode 100644
index 0000000..9279d22
--- /dev/null
+++ b/vendor/aws/aws-sdk-php/src/S3/ApplyChecksumMiddleware.php
@@ -0,0 +1,117 @@
+<?php
+namespace Aws\S3;
+
+use Aws\Api\Service;
+use Aws\CommandInterface;
+use GuzzleHttp\Psr7;
+use InvalidArgumentException;
+use Psr\Http\Message\RequestInterface;
+
+/**
+ * Apply required or optional checksums to requests before sending.
+ *
+ * IMPORTANT: This middleware must be added after the "build" step.
+ *
+ * @internal
+ */
+class ApplyChecksumMiddleware
+{
+ use CalculatesChecksumTrait;
+ private static $sha256 = [
+ 'PutObject',
+ 'UploadPart',
+ ];
+
+ /** @var Service */
+ private $api;
+
+ private $nextHandler;
+
+ /**
+ * Create a middleware wrapper function.
+ *
+ * @param Service $api
+ * @return callable
+ */
+ public static function wrap(Service $api)
+ {
+ return function (callable $handler) use ($api) {
+ return new self($handler, $api);
+ };
+ }
+
+ public function __construct(callable $nextHandler, Service $api)
+ {
+ $this->api = $api;
+ $this->nextHandler = $nextHandler;
+ }
+
+ public function __invoke(
+ CommandInterface $command,
+ RequestInterface $request
+ ) {
+ $next = $this->nextHandler;
+ $name = $command->getName();
+ $body = $request->getBody();
+
+ $op = $this->api->getOperation($command->getName());
+
+ $checksumInfo = isset($op['httpChecksum'])
+ ? $op['httpChecksum']
+ : [];
+ $checksumMemberName = array_key_exists('requestAlgorithmMember', $checksumInfo)
+ ? $checksumInfo['requestAlgorithmMember']
+ : "";
+ $requestedAlgorithm = isset($command[$checksumMemberName])
+ ? $command[$checksumMemberName]
+ : null;
+ if (!empty($checksumMemberName) && !empty($requestedAlgorithm)) {
+ $requestedAlgorithm = strtolower($requestedAlgorithm);
+ $checksumMember = $op->getInput()->getMember($checksumMemberName);
+ $supportedAlgorithms = isset($checksumMember['enum'])
+ ? array_map('strtolower', $checksumMember['enum'])
+ : null;
+ if (is_array($supportedAlgorithms)
+ && in_array($requestedAlgorithm, $supportedAlgorithms)
+ ) {
+ $headerName = "x-amz-checksum-{$requestedAlgorithm}";
+ $encoded = $this->getEncodedValue($requestedAlgorithm, $body);
+ if (!$request->hasHeader($headerName)) {
+ $request = $request->withHeader($headerName, $encoded);
+ }
+ } else {
+ throw new InvalidArgumentException(
+ "Unsupported algorithm supplied for input variable {$checksumMemberName}."
+ . " Supported checksums for this operation include: "
+ . implode(", ", $supportedAlgorithms) . "."
+ );
+ }
+ return $next($command, $request);
+ }
+
+ if (!empty($checksumInfo)) {
+ //if the checksum member is absent, check if it's required
+ $checksumRequired = isset($checksumInfo['requestChecksumRequired'])
+ ? $checksumInfo['requestChecksumRequired']
+ : null;
+ if (!empty($checksumRequired) && !$request->hasHeader('Content-MD5')) {
+ // Set the content MD5 header for operations that require it.
+ $request = $request->withHeader(
+ 'Content-MD5',
+ base64_encode(Psr7\Utils::hash($body, 'md5', true))
+ );
+ return $next($command, $request);
+ }
+ }
+
+ if (in_array($name, self::$sha256) && $command['ContentSHA256']) {
+ // Set the content hash header if provided in the parameters.
+ $request = $request->withHeader(
+ 'X-Amz-Content-Sha256',
+ $command['ContentSHA256']
+ );
+ }
+
+ return $next($command, $request);
+ }
+}