<?php 
namespace Aws\S3; 
 
use Aws\CommandInterface; 
use Aws\ResultInterface; 
use Psr\Http\Message\RequestInterface; 
 
/** 
 * Injects ObjectURL into the result of the PutObject operation. 
 * 
 * @internal 
 */ 
class PutObjectUrlMiddleware 
{ 
    /** @var callable  */ 
    private $nextHandler; 
 
    /** 
     * Create a middleware wrapper function. 
     * 
     * @return callable 
     */ 
    public static function wrap() 
    { 
        return function (callable $handler) { 
            return new self($handler); 
        }; 
    } 
 
    /** 
     * @param callable $nextHandler Next handler to invoke. 
     */ 
    public function __construct(callable $nextHandler) 
    { 
        $this->nextHandler = $nextHandler; 
    } 
 
    public function __invoke(CommandInterface $command, RequestInterface $request = null) 
    { 
        $next = $this->nextHandler; 
        return $next($command, $request)->then( 
            function (ResultInterface $result) use ($command) { 
                $name = $command->getName(); 
                switch ($name) { 
                    case 'PutObject': 
                    case 'CopyObject': 
                        $result['ObjectURL'] = $result['@metadata']['effectiveUri']; 
                        break; 
                    case 'CompleteMultipartUpload': 
                        $result['ObjectURL'] = $result['Location']; 
                        break; 
                } 
                return $result; 
            } 
        ); 
    } 
} 
 
 |