public function getRetryRaw($url, array $headers = [], $tries = 3, array $status = null, $delay = null, array $customChain = null) { $status = $status ?: [500, 503]; $retry = new Retry(['filter' => Retry::createChainFilter($customChain ?: [Retry::createIdempotentFilter(), Retry::createCurlFilter(), Retry::createStatusFilter($status)]), 'max' => $tries, 'delay' => function ($retries, AbstractTransferEvent $e) use($delay) { info('Delaying...'); return $delay ?: (int) pow(2, $retries - 1); }]); $client = new HttpClient(); $client->getEmitter()->attach($retry); return $client->get($url, ['headers' => $headers]); }
/** * {@inheritDoc} */ public function registerSubscribers(EventDispatcherInterface $eventDispatcher) { $filter = RetrySubscriber::createChainFilter([RetrySubscriber::createIdempotentFilter(), RetrySubscriber::createStatusFilter([429, 500, 503])]); $retry = new RetrySubscriber(['filter' => $filter, 'delay' => function ($number, $event) { /** @var \GuzzleHttp\Message\Response $response */ if (null !== $event->getResponse() && $event->getResponse()->getStatusCode() === 429) { // Adding 20% of the waiting time as it seems to be the best result without getting two blocking reqs. $sleep = (int) $event->getResponse()->getHeader('retry-after') * 1.2; if ($sleep >= 0) { return $sleep * 1000; } } return 0; }, 'max' => 3]); $this->client->getEmitter()->attach($retry); }
public function testCreatesIdempotentFilter() { $u = 'http://foo.com'; $f = RetrySubscriber::createIdempotentFilter(); $e = $this->createEvent(new Response(500), new Request('GET', $u)); $this->assertFalse($f(1, $e)); $e = $this->createEvent(new Response(500), new Request('PUT', $u)); $this->assertFalse($f(1, $e)); $e = $this->createEvent(new Response(500), new Request('DELETE', $u)); $this->assertFalse($f(1, $e)); $e = $this->createEvent(new Response(500), new Request('HEAD', $u)); $this->assertFalse($f(1, $e)); $e = $this->createEvent(new Response(500), new Request('OPTIONS', $u)); $this->assertFalse($f(1, $e)); $e = $this->createEvent(new Response(500), new Request('POST', $u)); $this->assertSame(-1, $f(1, $e)); $e = $this->createEvent(new Response(500), new Request('PATCH', $u)); $this->assertSame(-1, $f(1, $e)); }
/** * Get the retry subscriber. * * @return \GuzzleHttp\Subscriber\Retry\RetrySubscriber */ protected function getRetrySubscriber() { $filter = RetrySubscriber::createChainFilter([RetrySubscriber::createIdempotentFilter(), RetrySubscriber::createStatusFilter()]); return new RetrySubscriber(['filter' => $filter]); }