You are here

public function MockHandler::__invoke in Lockr 7.3

File

vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php, line 63

Class

MockHandler
Handler that returns responses or throw exceptions from a queue.

Namespace

GuzzleHttp\Handler

Code

public function __invoke(RequestInterface $request, array $options) {
  if (!$this->queue) {
    throw new \OutOfBoundsException('Mock queue is empty');
  }
  if (isset($options['delay'])) {
    usleep($options['delay'] * 1000);
  }
  $this->lastRequest = $request;
  $this->lastOptions = $options;
  $response = array_shift($this->queue);
  if (isset($options['on_headers'])) {
    if (!is_callable($options['on_headers'])) {
      throw new \InvalidArgumentException('on_headers must be callable');
    }
    try {
      $options['on_headers']($response);
    } catch (\Exception $e) {
      $msg = 'An error was encountered during the on_headers event';
      $response = new RequestException($msg, $request, $response, $e);
    }
  }
  if (is_callable($response)) {
    $response = call_user_func($response, $request, $options);
  }
  $response = $response instanceof \Exception ? \GuzzleHttp\Promise\rejection_for($response) : \GuzzleHttp\Promise\promise_for($response);
  return $response
    ->then(function ($value) use ($request, $options) {
    $this
      ->invokeStats($request, $options, $value);
    if ($this->onFulfilled) {
      call_user_func($this->onFulfilled, $value);
    }
    if (isset($options['sink'])) {
      $contents = (string) $value
        ->getBody();
      $sink = $options['sink'];
      if (is_resource($sink)) {
        fwrite($sink, $contents);
      }
      elseif (is_string($sink)) {
        file_put_contents($sink, $contents);
      }
      elseif ($sink instanceof \Psr\Http\Message\StreamInterface) {
        $sink
          ->write($contents);
      }
    }
    return $value;
  }, function ($reason) use ($request, $options) {
    $this
      ->invokeStats($request, $options, null, $reason);
    if ($this->onRejected) {
      call_user_func($this->onRejected, $reason);
    }
    return \GuzzleHttp\Promise\rejection_for($reason);
  });
}