Chris@0: onFulfilled = $onFulfilled; Chris@0: $this->onRejected = $onRejected; Chris@0: Chris@0: if ($queue) { Chris@0: call_user_func_array([$this, 'append'], $queue); Chris@0: } Chris@0: } Chris@0: Chris@0: public function __invoke(RequestInterface $request, array $options) Chris@0: { Chris@0: if (!$this->queue) { Chris@0: throw new \OutOfBoundsException('Mock queue is empty'); Chris@0: } Chris@0: Chris@0: if (isset($options['delay'])) { Chris@0: usleep($options['delay'] * 1000); Chris@0: } Chris@0: Chris@0: $this->lastRequest = $request; Chris@0: $this->lastOptions = $options; Chris@0: $response = array_shift($this->queue); Chris@0: Chris@0: if (isset($options['on_headers'])) { Chris@0: if (!is_callable($options['on_headers'])) { Chris@0: throw new \InvalidArgumentException('on_headers must be callable'); Chris@0: } Chris@0: try { Chris@0: $options['on_headers']($response); Chris@0: } catch (\Exception $e) { Chris@0: $msg = 'An error was encountered during the on_headers event'; Chris@0: $response = new RequestException($msg, $request, $response, $e); Chris@0: } Chris@0: } Chris@0: Chris@0: if (is_callable($response)) { Chris@0: $response = call_user_func($response, $request, $options); Chris@0: } Chris@0: Chris@0: $response = $response instanceof \Exception Chris@0: ? \GuzzleHttp\Promise\rejection_for($response) Chris@0: : \GuzzleHttp\Promise\promise_for($response); Chris@0: Chris@0: return $response->then( Chris@0: function ($value) use ($request, $options) { Chris@0: $this->invokeStats($request, $options, $value); Chris@0: if ($this->onFulfilled) { Chris@0: call_user_func($this->onFulfilled, $value); Chris@0: } Chris@0: if (isset($options['sink'])) { Chris@0: $contents = (string) $value->getBody(); Chris@0: $sink = $options['sink']; Chris@0: Chris@0: if (is_resource($sink)) { Chris@0: fwrite($sink, $contents); Chris@0: } elseif (is_string($sink)) { Chris@0: file_put_contents($sink, $contents); Chris@0: } elseif ($sink instanceof \Psr\Http\Message\StreamInterface) { Chris@0: $sink->write($contents); Chris@0: } Chris@0: } Chris@0: Chris@0: return $value; Chris@0: }, Chris@0: function ($reason) use ($request, $options) { Chris@0: $this->invokeStats($request, $options, null, $reason); Chris@0: if ($this->onRejected) { Chris@0: call_user_func($this->onRejected, $reason); Chris@0: } Chris@0: return \GuzzleHttp\Promise\rejection_for($reason); Chris@0: } Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Adds one or more variadic requests, exceptions, callables, or promises Chris@0: * to the queue. Chris@0: */ Chris@0: public function append() Chris@0: { Chris@0: foreach (func_get_args() as $value) { Chris@0: if ($value instanceof ResponseInterface Chris@0: || $value instanceof \Exception Chris@0: || $value instanceof PromiseInterface Chris@0: || is_callable($value) Chris@0: ) { Chris@0: $this->queue[] = $value; Chris@0: } else { Chris@0: throw new \InvalidArgumentException('Expected a response or ' Chris@0: . 'exception. Found ' . \GuzzleHttp\describe_type($value)); Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the last received request. Chris@0: * Chris@0: * @return RequestInterface Chris@0: */ Chris@0: public function getLastRequest() Chris@0: { Chris@0: return $this->lastRequest; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the last received request options. Chris@0: * Chris@0: * @return array Chris@0: */ Chris@0: public function getLastOptions() Chris@0: { Chris@0: return $this->lastOptions; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns the number of remaining items in the queue. Chris@0: * Chris@0: * @return int Chris@0: */ Chris@0: public function count() Chris@0: { Chris@0: return count($this->queue); Chris@0: } Chris@0: Chris@0: private function invokeStats( Chris@0: RequestInterface $request, Chris@0: array $options, Chris@0: ResponseInterface $response = null, Chris@0: $reason = null Chris@0: ) { Chris@0: if (isset($options['on_stats'])) { Chris@0: $stats = new TransferStats($request, $response, 0, $reason); Chris@0: call_user_func($options['on_stats'], $stats); Chris@0: } Chris@0: } Chris@0: }