/** * @param string $token * @param int $maxRetries */ public function __construct($token, $maxRetries = self::MAX_RETRIES) { $handler = new GuzzleClient(['base_url' => self::BASE_URL, 'defaults' => ['headers' => ['Content-Type' => 'application/json', 'Accept' => 'application/json', 'Authorization' => sprintf('Bearer %s', $token)]]]); $retry = new RetrySubscriber(['filter' => RetrySubscriber::createChainFilter([RetrySubscriber::createCurlFilter([CURLE_PARTIAL_FILE]), RetrySubscriber::createStatusFilter([500, 502, 503, 504])]), 'max' => $maxRetries]); $handler->getEmitter()->attach($retry); $this->client = new Client($handler); }
/** @internal */ public static function _applyRetryConfig($value, array &$args) { if (!$value) { return; } $args['client']->getEmitter()->attach(new RetrySubscriber(ClientResolver::_wrapDebugLogger($args, ['max' => $value, 'delay' => function ($retries) { return $retries ? 50 * (int) pow(2, $retries - 1) / 1000 : 0; }, 'filter' => RetrySubscriber::createChainFilter([new ThrottlingFilter($args['error_parser']), new Crc32Filter($args['error_parser']), RetrySubscriber::createStatusFilter(), RetrySubscriber::createConnectFilter()])]))); }
/** * @return Client */ private function getClient() { if (null === $this->client) { $this->client = new Client(['base_url' => static::API_BASE_URL, 'defaults' => ['headers' => ['user-id' => 'vicb', 'api-name' => $this->apiName, 'api-key' => $this->apiKey, 'Accept' => 'application/json']]]); $retry = new RetrySubscriber(['filter' => RetrySubscriber::createStatusFilter(), 'max' => 3]); $this->client->getEmitter()->attach($retry); } return $this->client; }
/** * Create a client obj * @param string $baseUrl * @return Client */ private function createClient($baseUrl = self::TWITTER_API_URL) { $client = new Client(['base_url' => $baseUrl, 'defaults' => ['auth' => 'oauth', 'stream' => true]]); $oauth = new Oauth1(['consumer_key' => $this->consumerKey, 'consumer_secret' => $this->consumerSecret, 'token' => $this->accessKey, 'token_secret' => $this->accessSecret]); $retry = new RetrySubscriber(['filter' => RetrySubscriber::createStatusFilter([503]), 'max' => self::MAX_RETRIES]); $client->getEmitter()->attach($retry); $client->getEmitter()->attach($oauth); return $client; }
/** * Creates a Guzzle HTTP client and initializes it with the given configuration. * @param Collection $config * @return HttpClient */ protected function loadHttpClient(Collection $config) { $client = new HttpClient($config['http_client_options'] ?: []); // attach retry subscriber $maxRetries = (int) $config['max_retries']; if (0 < $maxRetries) { $client->getEmitter()->attach(new RetrySubscriber(['max' => $maxRetries, 'filter' => RetrySubscriber::createChainFilter([RetrySubscriber::createStatusFilter(), RetrySubscriber::createCurlFilter()])])); } return $client; }
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]); }
public function __construct($config) { $this->client = new Client(['base_url' => $this->endpoint, 'defaults' => ['auth' => 'oauth', 'stream' => true]]); $oauth = new Oauth1($config); $retry = new RetrySubscriber(['filter' => RetrySubscriber::createStatusFilter([503]), 'max' => $this->retries]); if ($this->log == true) { $this->client->getEmitter()->attach(new LogSubscriber($this->logger, $this->formatter)); } $this->client->getEmitter()->attach($retry); $this->client->getEmitter()->attach($oauth); }
private function getHttpClientFromConfig(array $config) { // If a client was provided, return it. if (isset($config['http_client'])) { return $config['http_client']; } // Create a Guzzle HttpClient. $clientOptions = isset($config['http_client_options']) ? $config['http_client_options'] : []; $client = new HttpClient($clientOptions); // Attach request retry logic. $client->getEmitter()->attach(new RetrySubscriber(['max' => $config['max_retries'], 'filter' => RetrySubscriber::createChainFilter([RetrySubscriber::createStatusFilter(), RetrySubscriber::createCurlFilter()])])); return $client; }
/** * {@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); }
/** * Get the retry subscriber. * * @return \GuzzleHttp\Subscriber\Retry\RetrySubscriber */ protected function getRetrySubscriber() { $filter = RetrySubscriber::createChainFilter([RetrySubscriber::createIdempotentFilter(), RetrySubscriber::createStatusFilter()]); return new RetrySubscriber(['filter' => $filter]); }
/** * @return callable[] */ private function getRetryFilters() { return array(RetrySubscriber::createStatusFilter(), RetrySubscriber::createConnectFilter(), $this->getMediawikiApiErrorRetrySubscriber()); }
public static function _wrapDebugLogger(array $clientArgs, array $conf) { // Add retry logger if (isset($clientArgs['retry_logger'])) { $conf['delay'] = RetrySubscriber::createLoggingDelay($conf['delay'], $clientArgs['retry_logger'] === 'debug' ? new SimpleLogger() : $clientArgs['retry_logger']); } return $conf; }
public function testCalculatesExponentialDelay() { $e = $this->createEvent(new Response(500)); $this->assertEquals(0, RetrySubscriber::exponentialDelay(0, $e)); $this->assertEquals(1, RetrySubscriber::exponentialDelay(1, $e)); $this->assertEquals(2, RetrySubscriber::exponentialDelay(2, $e)); $this->assertEquals(4, RetrySubscriber::exponentialDelay(3, $e)); $this->assertEquals(8, RetrySubscriber::exponentialDelay(4, $e)); }
protected static function getRetryDelay($retries, AbstractTransferEvent $event, $headerName) { if (is_null($event->getResponse()) || !$event->getResponse()->hasHeader($headerName)) { return RetrySubscriber::exponentialDelay($retries, $event); } $retryAfter = $event->getResponse()->getHeader($headerName); if (is_numeric($retryAfter)) { if ($retryAfter < time() - strtotime('1 day', 0)) { return $retryAfter; } else { return $retryAfter - time(); } } if (Utils::isValidDateTimeString($retryAfter, DATE_RFC1123)) { $date = \DateTime::createFromFormat(DATE_RFC1123, $retryAfter); return $date->getTimestamp() - time(); } return RetrySubscriber::exponentialDelay($retries, $event); }
/** * Add the retry subscriber to the guzzle client. * * @param \GuzzleHttp\Client $guzzle * * @return \GuzzleHttp\Client */ protected function addRetrySubscriber(GuzzleClient $guzzle) { // Build retry subscriber $retry = new RetrySubscriber(['filter' => RetrySubscriber::createStatusFilter($this->retryOn), 'delay' => function ($number, $event) { return $this->retryDelay; }, 'max' => $this->retry]); // add the retry emitter $guzzle->getEmitter()->attach($retry); return $guzzle; }
private static function createRetry() { return function ($value, array &$args) { if ($value) { $args['client']->getEmitter()->attach(new RetrySubscriber(ClientResolver::_wrapDebugLogger($args, ['max' => $value, 'delay' => ['GuzzleHttp\\Subscriber\\Retry\\RetrySubscriber', 'exponentialDelay'], 'filter' => RetrySubscriber::createChainFilter([new S3TimeoutFilter(), new ThrottlingFilter($args['error_parser']), RetrySubscriber::createStatusFilter(), RetrySubscriber::createConnectFilter()])]))); } }; }