/**
  * @param \Ikwattro\GuzzleStereo\Recorder
  *
  * @return callable
  */
 public static function record(Recorder $recorder)
 {
     return function (callable $handler) use($recorder) {
         return function ($request, array $options) use($handler, $recorder) {
             return $handler($request, $options)->then(function ($response) use($request, $recorder) {
                 $recorder->record($response);
                 return $response;
             }, function ($reason) use($request, $recorder) {
                 $response = $reason instanceof RequestException ? $reason->getResponse() : null;
                 if ($response) {
                     $recorder->record($response);
                 }
                 return \GuzzleHttp\Promise\rejection_for($reason);
             });
         };
     };
 }
Example #2
0
 /**
  * {@inheritdoc}
  */
 public function __invoke()
 {
     return function ($handler) {
         return function (RequestInterface $request, array $options) use($handler) {
             $options['on_stats'] = function (TransferStats $stats) use($request) {
                 $request->stats = $stats;
             };
             return $handler($request, $options)->then(function ($response) use($request) {
                 $this->completedRequests[] = ['request' => $request, 'response' => $response];
                 return $response;
             }, function ($reason) use($request) {
                 $response = $reason instanceof RequestException ? $reason->getResponse() : null;
                 $this->failedRequests[] = ['request' => $request, 'response' => $response, 'message' => $reason->getMessage()];
                 return \GuzzleHttp\Promise\rejection_for($reason);
             });
         };
     };
 }
 /**
  * @param CommandInterface $command
  * @param RequestInterface $request
  *
  * @return PromiseInterface
  */
 public function __invoke(CommandInterface $command, RequestInterface $request = null)
 {
     $retries = 0;
     $handler = $this->nextHandler;
     $decider = $this->decider;
     $delay = $this->delay;
     $g = function ($value) use($handler, $decider, $delay, $command, $request, &$retries, &$g) {
         if ($value instanceof \Exception) {
             if (!$decider($retries, $command, $request, null, $value)) {
                 return \GuzzleHttp\Promise\rejection_for($value);
             }
         } elseif ($value instanceof ResultInterface && !$decider($retries, $command, $request, $value, null)) {
             return $value;
         }
         // Delay fn is called with 0, 1, ... so increment after the call.
         $command['@http']['delay'] = $delay($retries++);
         return $handler($command, $request)->then($g, $g);
     };
     return $handler($command, $request)->then($g, $g);
 }
 public function __invoke(CommandInterface $command, RequestInterface $request = null)
 {
     $retries = 0;
     $handler = $this->nextHandler;
     $decider = $this->decider;
     $delay = $this->delay;
     $g = function ($value) use($handler, $decider, $delay, $command, $request, &$retries, &$g) {
         if ($value instanceof \Exception) {
             if (!$decider($retries, $command, $request, null, $value)) {
                 return \GuzzleHttp\Promise\rejection_for($value);
             }
         } elseif ($value instanceof ResultInterface && !$decider($retries, $command, $request, $value, null)) {
             return $value;
         }
         // 使用 0,1,2 之类的数字调用延迟函数,所以调用过后要递增。
         $command['@http']['delay'] = $delay($retries++);
         return $handler($command, $request)->then($g, $g);
     };
     return $handler($command, $request)->then($g, $g);
 }
 /**
  * Logging each Request
  *
  * @author  Florian Preusner
  * @since   2015-06
  * @version 3.0
  *
  * @return  callable
  */
 public function log()
 {
     $logger = $this->logger;
     $formatter = $this->formatter;
     return function (callable $handler) use($logger, $formatter) {
         return function ($request, array $options) use($handler, $logger, $formatter) {
             return $handler($request, $options)->then(function ($response) use($logger, $request, $formatter) {
                 $message = $formatter->format($request, $response);
                 $context = compact('request', 'response');
                 $logger->info($message, $context);
                 return $response;
             }, function ($reason) use($logger, $request, $formatter) {
                 $response = $reason instanceof RequestException ? $reason->getResponse() : null;
                 $message = $formatter->format($request, $response, $reason);
                 $context = compact('request', 'response');
                 $logger->notice($message, $context);
                 return \GuzzleHttp\Promise\rejection_for($reason);
             });
         };
     };
 }
Example #6
0
 public function testReturnsPromisesAsIsInRejectionFor()
 {
     $a = new Promise();
     $b = \GuzzleHttp\Promise\rejection_for($a);
     $this->assertSame($a, $b);
 }
 /**
  * @param CommandInterface $command
  * @param RequestInterface $request
  *
  * @return PromiseInterface
  */
 public function __invoke(CommandInterface $command, RequestInterface $request = null)
 {
     $retries = 0;
     $requestStats = [];
     $handler = $this->nextHandler;
     $decider = $this->decider;
     $delay = $this->delay;
     $request = $this->addRetryHeader($request, 0, 0);
     $g = function ($value) use($handler, $decider, $delay, $command, $request, &$retries, &$requestStats, &$g) {
         $this->updateHttpStats($value, $requestStats);
         if ($value instanceof \Exception) {
             if (!$decider($retries, $command, $request, null, $value)) {
                 return \GuzzleHttp\Promise\rejection_for($this->bindStatsToReturn($value, $requestStats));
             }
         } elseif ($value instanceof ResultInterface && !$decider($retries, $command, $request, $value, null)) {
             return $this->bindStatsToReturn($value, $requestStats);
         }
         // Delay fn is called with 0, 1, ... so increment after the call.
         $delayBy = $delay($retries++);
         $command['@http']['delay'] = $delayBy;
         if ($this->collectStats) {
             $this->updateStats($retries, $delayBy, $requestStats);
         }
         // Update retry header with retry count and delayBy
         $request = $this->addRetryHeader($request, $retries, $delayBy);
         return $handler($command, $request)->then($g, $g);
     };
     return $handler($command, $request)->then($g, $g);
 }
Example #8
0
 /**
  * Middleware that logs requests, responses, and errors using a message
  * formatter.
  *
  * @param LoggerInterface  $logger Logs messages.
  * @param MessageFormatter $formatter Formatter used to create message strings.
  * @param string           $logLevel Level at which to log requests.
  *
  * @return callable Returns a function that accepts the next handler.
  */
 public static function log(LoggerInterface $logger, MessageFormatter $formatter, $logLevel = LogLevel::INFO)
 {
     return function (callable $handler) use($logger, $formatter, $logLevel) {
         return function ($request, array $options) use($handler, $logger, $formatter, $logLevel) {
             return $handler($request, $options)->then(function ($response) use($logger, $request, $formatter, $logLevel) {
                 $message = $formatter->format($request, $response);
                 $logger->log($logLevel, $message);
                 return $response;
             }, function ($reason) use($logger, $request, $formatter) {
                 $response = $reason instanceof RequestException ? $reason->getResponse() : null;
                 $message = $formatter->format($request, $response, $reason);
                 $logger->notice($message);
                 return \GuzzleHttp\Promise\rejection_for($reason);
             });
         };
     };
 }
Example #9
0
 private function getRequestRejectedFn(RequestInterface $request)
 {
     return function ($reason) use($request) {
         $this->queue->complete($request);
         // Delegate processing of the item out to the dispatcher.
         if ($reason instanceof BadResponseException) {
             $response = $reason->getResponse();
             try {
                 $this->dispatchFailure($request, $response);
             } catch (\Exception $e) {
                 $this->dispatchException($request, $e, $response);
                 throw $e;
             }
         }
         return \GuzzleHttp\Promise\rejection_for($reason);
     };
 }