<?php 
namespace Aws\S3; 
 
use Aws\CommandInterface; 
use Aws\ResultInterface; 
use Aws\S3\Exception\PermanentRedirectException; 
use Psr\Http\Message\RequestInterface; 
 
/** 
 * Throws a PermanentRedirectException exception when a 301 redirect is 
 * encountered. 
 * 
 * @internal 
 */ 
class PermanentRedirectMiddleware 
{ 
    /** @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) { 
                $status = isset($result['@metadata']['statusCode']) 
                    ? $result['@metadata']['statusCode'] 
                    : null; 
                if ($status == 301) { 
                    throw new PermanentRedirectException( 
                        'Encountered a permanent redirect while requesting ' 
                        . $result->search('"@metadata".effectiveUri') . '. ' 
                        . 'Are you sure you are using the correct region for ' 
                        . 'this bucket?', 
                        $command, 
                        ['result' => $result] 
                    ); 
                } 
                return $result; 
            } 
        ); 
    } 
} 
 
 |