getHandlerList(); $stack->appendBuild($this->getApiVersionMiddleware(), 'glacier.api_version'); $stack->appendBuild($this->getChecksumsMiddleware(), 'glacier.checksum'); $stack->appendBuild( Middleware::contentType(['UploadArchive', 'UploadPart']), 'glacier.content_type' ); $stack->appendInit( Middleware::sourceFile($this->getApi(), 'body', 'sourceFile'), 'glacier.source_file' ); } /** * {@inheritdoc} * * Sets the default accountId to "-" for all operations. */ public function getCommand($name, array $args = []) { return parent::getCommand($name, $args + ['accountId' => '-']); } /** * Creates a middleware that updates a command with the content and tree * hash headers for upload operations. * * @return callable * @throws CouldNotCreateChecksumException if the body is not seekable. */ 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); }; }; } /** * Creates a middleware that adds the API version header for all requests. * * @return callable */ private function getApiVersionMiddleware() { return function (callable $handler) { return function ( CommandInterface $command, RequestInterface $request = null ) use ($handler) { return $handler($command, $request->withHeader( 'x-amz-glacier-version', $this->getApi()->getMetadata('apiVersion') )); }; }; } /** * @internal * @codeCoverageIgnore */ public static function applyDocFilters(array $api, array $docs) { // Add the SourceFile parameter. $docs['shapes']['SourceFile']['base'] = 'The path to a file on disk to use instead of the body parameter.'; $api['shapes']['SourceFile'] = ['type' => 'string']; $api['shapes']['UploadArchiveInput']['members']['sourceFile'] = ['shape' => 'SourceFile']; $api['shapes']['UploadMultipartPartInput']['members']['sourceFile'] = ['shape' => 'SourceFile']; // Add the ContentSHA256 parameter. $docs['shapes']['ContentSHA256']['base'] = 'A SHA256 hash of the content of the request body'; $api['shapes']['ContentSHA256'] = ['type' => 'string']; $api['shapes']['UploadArchiveInput']['members']['contentSHA256'] = ['shape' => 'ContentSHA256']; $api['shapes']['UploadMultipartPartInput']['members']['contentSHA256'] = ['shape' => 'ContentSHA256']; // Add information about "checksum" and "ContentSHA256" being optional. $optional = '