/** * @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); }); }; }; }
/** * {@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); }); }; }; }
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); }
/** * 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); }); }; }; }
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); }; }