From 71208bb6661707d006f2d3a0639f4b45fabf1809 Mon Sep 17 00:00:00 2001 From: Joe Dixon Date: Mon, 31 Oct 2022 16:54:23 +0000 Subject: [PATCH] Add retry middleware on asset upload --- src/Aws/AwsStorageProvider.php | 40 ++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/src/Aws/AwsStorageProvider.php b/src/Aws/AwsStorageProvider.php index c2782580..4790f026 100644 --- a/src/Aws/AwsStorageProvider.php +++ b/src/Aws/AwsStorageProvider.php @@ -3,18 +3,25 @@ namespace Laravel\VaporCli\Aws; use GuzzleHttp\Client; +use GuzzleHttp\HandlerStack; +use GuzzleHttp\Middleware; use GuzzleHttp\Pool; use GuzzleHttp\Psr7\Request; use Illuminate\Support\LazyCollection; +use Illuminate\Support\Str; use Laravel\VaporCli\ConsoleVaporClient; use Laravel\VaporCli\Exceptions\RequestFailedException; use Laravel\VaporCli\Helpers; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; use Symfony\Component\Console\Helper\ProgressBar; class AwsStorageProvider { protected $vapor; + const MAX_RETRIES = 3; + /** * Create a new storage provider instance. * @@ -55,8 +62,8 @@ public function store($url, array $headers, $file, $withProgress = false) : null; $response = (new Client())->request('PUT', $url, array_filter([ - 'body' => $stream, - 'headers' => empty($headers) ? null : $headers, + 'body' => $stream, + 'headers' => empty($headers) ? null : $headers, 'progress' => $progressCallback, ])); @@ -119,7 +126,7 @@ public function executeStoreRequests($requests, $assetPath, $callback) } }; - (new Pool(new Client(), $generator(), [ + (new Pool(new Client(['handler' => $this->retryHandler()]), $generator(), [ 'concurrency' => 10, 'rejected' => function ($reason, $index) { throw new RequestFailedException($reason->getMessage(), $index); @@ -158,7 +165,7 @@ public function executeCopyRequests($requests, $callback) } }; - (new Pool(new Client(), $generator(), [ + (new Pool(new Client(['handler' => $this->retryHandler()]), $generator(), [ 'concurrency' => 10, 'rejected' => function ($reason, $index) { throw new RequestFailedException($reason->getMessage(), $index); @@ -167,4 +174,29 @@ public function executeCopyRequests($requests, $callback) ->promise() ->wait(); } + + /** + * Get a handler stack containing the retry middleware configuration. + * + * @return \GuzzleHttp\HandlerStack + */ + private function retryHandler() + { + $stack = HandlerStack::create(); + $stack->push(Middleware::retry(function (int $retries, RequestInterface $request, ResponseInterface $response = null) { + if ($retries === 0) { + return true; + } + + if ($response && $response->getStatusCode() < 300) { + return false; + } + + Helpers::step('Retrying Request: '.$request->getMethod().' '.Str::before($request->getUri(), '?')); + + return $retries < self::MAX_RETRIES; + })); + + return $stack; + } }