Вход Регистрация
Файл: includes/library/aws/Aws/Ec2/CopySnapshotMiddleware.php
Строк: 141
<?php
namespace AwsEc2;

use 
AwsAwsClientInterface;
use 
AwsSignatureSignatureV4;
use 
AwsEndpointEndpointProvider;
use 
AwsCommandInterface;
use 
GuzzleHttpPsr7Uri;
use 
PsrHttpMessageRequestInterface;

/**
 * @internal Adds computed values to the CopySnapshot operation.
 */
class CopySnapshotMiddleware
{
    private 
$client;
    private 
$endpointProvider;
    private 
$nextHandler;

    public static function 
wrap(AwsClientInterface $client, callable $endpointProvider)
    {
        return function (callable 
$handler) use ($endpointProvider$client) {
            
$f = new CopySnapshotMiddleware($endpointProvider$client$handler);
            return 
$f;
        };
    }

    public function 
__construct(
        callable 
$endpointProvider,
        
AwsClientInterface $client,
        callable 
$nextHandler
    
) {
        
$this->endpointProvider $endpointProvider;
        
$this->client $client;
        
$this->nextHandler $nextHandler;
    }

    public function 
__invoke(CommandInterface $cmdRequestInterface $request null)
    {
        if (
$cmd->getName() == 'CopySnapshot'
            
&& (!isset($cmd->__skipCopySnapshot))
        ) {
            
$cmd['PresignedUrl'] = $this->createPresignedUrl($this->client$cmd);
            
$cmd['DestinationRegion'] = $this->client->getRegion();
        }

        
$f $this->nextHandler;
        return 
$f($cmd$request);
    }

    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 Awsserialize($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();
    }
}
Онлайн: 1
Реклама