From df76e5785f87d9113ca1802a2f8c948c6acb686e Mon Sep 17 00:00:00 2001 From: Brent Shaffer Date: Thu, 26 Aug 2021 10:53:47 -0700 Subject: [PATCH 1/3] feat: add retryable --- src/Middleware/RetryMiddleware.php | 94 ++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 src/Middleware/RetryMiddleware.php diff --git a/src/Middleware/RetryMiddleware.php b/src/Middleware/RetryMiddleware.php new file mode 100644 index 0000000000..03fcefe754 --- /dev/null +++ b/src/Middleware/RetryMiddleware.php @@ -0,0 +1,94 @@ + 1] + $config; + $this->retryAttempts = $config['retryAttempts']; + } + + /** + * Retry the response if it has retryable error codes. + * + * use Google\Auth\Middleware\AuthTokenMiddleware; + * use Google\Auth\Middleware\RetryMiddleware; + * use Google\Auth\OAuth2; + * use GuzzleHttp\Client; + * use GuzzleHttp\HandlerStack; + * + * $config = [...]; + * $oauth2 = new OAuth2($config) + * $authMiddleware = new AuthTokenMiddleware($oauth2); + * $retryMiddleware = new RetryMiddleware($retryAttempts = 3); + * $stack = HandlerStack::create(); + * $stack->push($authMiddleware); + * $stack->push($retryMiddleware); + * + * $client = new Client([ + * 'handler' => $stack, + * 'base_uri' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/', + * 'auth' => 'google_auth' // authorize all requests + * ]); + * + * $res = $client->get('myproject/taskqueues/myqueue'); + * + * @param callable $handler + * @return \Closure + */ + public function __invoke(callable $handler) + { + return function (RequestInterface $request, array $options) use ($handler) { + $response = $handler($request, $options); + for ($attempts = 0; $attempts < $this->retryAttempts; $attempts++) { + if ($this->isRetryable($response)) { + $response = $handler($request, $options); + } + } + return $response; + }; + } + + private function isRetryable(ResponseInterface $response) + { + // no-op for now, this is a Proof of Concept! + return false; + } +} From 7b43a39a6a12fd9dbb7bbadf1dd006402ac66da4 Mon Sep 17 00:00:00 2001 From: Brent Shaffer Date: Thu, 26 Aug 2021 11:11:42 -0700 Subject: [PATCH 2/3] require retryAttemps to be set --- src/Middleware/RetryMiddleware.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Middleware/RetryMiddleware.php b/src/Middleware/RetryMiddleware.php index 03fcefe754..9f289653ac 100644 --- a/src/Middleware/RetryMiddleware.php +++ b/src/Middleware/RetryMiddleware.php @@ -41,7 +41,10 @@ class RetryMiddleware */ public function __construct($config = []) { - $config = ['retryAttempts' => 1] + $config; + if (!isset($config['retryAttempts'])) { + throw new \InvalidArgumentException('requires retryAttempts to be set'); + } + $this->retryAttempts = $config['retryAttempts']; } @@ -57,7 +60,7 @@ public function __construct($config = []) * $config = [...]; * $oauth2 = new OAuth2($config) * $authMiddleware = new AuthTokenMiddleware($oauth2); - * $retryMiddleware = new RetryMiddleware($retryAttempts = 3); + * $retryMiddleware = new RetryMiddleware(['retryAttempts' => 3]); * $stack = HandlerStack::create(); * $stack->push($authMiddleware); * $stack->push($retryMiddleware); From cbf1748f0c0d8aa12c57927dd794b41bffc597a2 Mon Sep 17 00:00:00 2001 From: Brent Shaffer Date: Thu, 26 Aug 2021 11:36:27 -0700 Subject: [PATCH 3/3] Update RetryMiddleware.php --- src/Middleware/RetryMiddleware.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Middleware/RetryMiddleware.php b/src/Middleware/RetryMiddleware.php index 9f289653ac..86b7091ece 100644 --- a/src/Middleware/RetryMiddleware.php +++ b/src/Middleware/RetryMiddleware.php @@ -39,7 +39,7 @@ class RetryMiddleware * @type int $retryAttempts number of retry attempts. * } */ - public function __construct($config = []) + public function __construct(array $config = []) { if (!isset($config['retryAttempts'])) { throw new \InvalidArgumentException('requires retryAttempts to be set');