Exemplo n.º 1
0
 /**
  * @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);
 }
Exemplo n.º 2
0
 /** @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()])])));
 }
Exemplo n.º 3
0
 /**
  * @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;
 }
Exemplo n.º 5
0
 /**
  * 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;
 }
Exemplo n.º 6
0
 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);
 }
Exemplo n.º 8
0
 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;
 }
Exemplo n.º 9
0
 /**
  * {@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]);
 }
Exemplo n.º 11
0
 /**
  * @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));
 }
Exemplo n.º 14
0
 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);
 }
Exemplo n.º 15
0
 /**
  * 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;
 }
Exemplo n.º 16
0
 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()])])));
         }
     };
 }