/**
  * @param array    $request
  * @param Resource $resource
  * @param array    $args
  *
  * @return Command
  */
 private function prepareCommand(array $request, Resource $resource, array $args = [])
 {
     if (isset($request['params'])) {
         $this->prepareArgs($request['params'], $resource, $args);
     }
     return $this->apiClient->getCommand($request['operation'], $args);
 }
 private function createPresignedUrl(AwsClientInterface $client, CommandInterface $cmd)
 {
     $newCmd = $client->getCommand('CopySnapshot', $cmd->toArray());
     $newCmd->getEmitter()->detach($this);
     // Serialize a request for the CopySnapshot operation.
     $request = $client->initTransaction($newCmd)->request;
     // Create the new endpoint for the target endpoint.
     $endpoint = EndpointProvider::resolve($this->endpointProvider, ['region' => $cmd['SourceRegion'], 'service' => 'ec2'])['endpoint'];
     // Set the request to hit the target endpoint.
     $request->setHost(Url::fromString($endpoint)->getHost());
     // Create a presigned URL for our generated request.
     $signer = new SignatureV4('ec2', $cmd['SourceRegion']);
     return $signer->createPresignedUrl(SignatureV4::convertPostToGet($request), $client->getCredentials(), '+1 hour');
 }
 private function createPresignedUrl(AwsClientInterface $client, CommandInterface $cmd)
 {
     $newCmd = $client->getCommand('CopySnapshot', $cmd->toArray());
     // Avoid infinite recursion by flagging the new command.
     $newCmd->__skipCopySnapshot = true;
     // Serialize a request for the CopySnapshot operation.
     $request = \Aws\serialize($newCmd);
     // Create the new endpoint for the target endpoint.
     $endpoint = EndpointProvider::resolve($this->endpointProvider, ['region' => $cmd['SourceRegion'], 'service' => 'ec2'])['endpoint'];
     // Set the request to hit the target endpoint.
     $uri = $request->getUri()->withHost((new Uri($endpoint))->getHost());
     $request = $request->withUri($uri);
     // Create a presigned URL for our generated request.
     $signer = new SignatureV4('ec2', $cmd['SourceRegion']);
     return (string) $signer->presign(SignatureV4::convertPostToGet($request), $client->getCredentials()->wait(), '+1 hour')->getUri();
 }
 private function flushQueue()
 {
     static $validKeys = ['Key' => true, 'VersionId' => true];
     if (count($this->queue) === 0) {
         return null;
     }
     $batch = [];
     while ($obj = array_shift($this->queue)) {
         $batch[] = array_intersect_key($obj, $validKeys);
     }
     $command = $this->client->getCommand('DeleteObjects', ['Bucket' => $this->bucket, 'Delete' => ['Objects' => $batch]]);
     if ($this->before) {
         call_user_func($this->before, $command);
     }
     return $this->client->executeAsync($command)->then(function ($result) {
         if (!empty($result['Errors'])) {
             throw new DeleteMultipleObjectsException($result['Deleted'] ?: [], $result['Errors']);
         }
         return $result;
     });
 }