PageRenderTime 26ms CodeModel.GetById 30ms RepoModel.GetById 0ms app.codeStats 0ms

/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php

https://gitlab.com/aleritty/yaitb
PHP | 163 lines | 106 code | 16 blank | 41 comment | 12 complexity | 8e49b1082c7f024b9226b9297e3530b6 MD5 | raw file
  1. <?php
  2. namespace GuzzleHttp\Handler;
  3. use GuzzleHttp\HandlerStack;
  4. use GuzzleHttp\Promise\PromiseInterface;
  5. use GuzzleHttp\Promise\RejectedPromise;
  6. use GuzzleHttp\TransferStats;
  7. use Psr\Http\Message\RequestInterface;
  8. use Psr\Http\Message\ResponseInterface;
  9. /**
  10. * Handler that returns responses or throw exceptions from a queue.
  11. */
  12. class MockHandler implements \Countable
  13. {
  14. private $queue;
  15. private $lastRequest;
  16. private $lastOptions;
  17. private $onFulfilled;
  18. private $onRejected;
  19. /**
  20. * Creates a new MockHandler that uses the default handler stack list of
  21. * middlewares.
  22. *
  23. * @param array $queue Array of responses, callables, or exceptions.
  24. * @param callable $onFulfilled Callback to invoke when the return value is fulfilled.
  25. * @param callable $onRejected Callback to invoke when the return value is rejected.
  26. *
  27. * @return MockHandler
  28. */
  29. public static function createWithMiddleware(
  30. array $queue = null,
  31. callable $onFulfilled = null,
  32. callable $onRejected = null
  33. ) {
  34. return HandlerStack::create(new self($queue, $onFulfilled, $onRejected));
  35. }
  36. /**
  37. * The passed in value must be an array of
  38. * {@see Psr7\Http\Message\ResponseInterface} objects, Exceptions,
  39. * callables, or Promises.
  40. *
  41. * @param array $queue
  42. * @param callable $onFulfilled Callback to invoke when the return value is fulfilled.
  43. * @param callable $onRejected Callback to invoke when the return value is rejected.
  44. */
  45. public function __construct(
  46. array $queue = null,
  47. callable $onFulfilled = null,
  48. callable $onRejected = null
  49. ) {
  50. $this->onFulfilled = $onFulfilled;
  51. $this->onRejected = $onRejected;
  52. if ($queue) {
  53. call_user_func_array([$this, 'append'], $queue);
  54. }
  55. }
  56. public function __invoke(RequestInterface $request, array $options)
  57. {
  58. if (!$this->queue) {
  59. throw new \OutOfBoundsException('Mock queue is empty');
  60. }
  61. if (isset($options['delay'])) {
  62. usleep($options['delay'] * 1000);
  63. }
  64. $this->lastRequest = $request;
  65. $this->lastOptions = $options;
  66. $response = array_shift($this->queue);
  67. if (is_callable($response)) {
  68. $response = $response($request, $options);
  69. }
  70. $response = $response instanceof \Exception
  71. ? new RejectedPromise($response)
  72. : \GuzzleHttp\Promise\promise_for($response);
  73. return $response->then(
  74. function ($value) use ($request, $options) {
  75. $this->invokeStats($request, $options, $value);
  76. if ($this->onFulfilled) {
  77. call_user_func($this->onFulfilled, $value);
  78. }
  79. return $value;
  80. },
  81. function ($reason) use ($request, $options) {
  82. $this->invokeStats($request, $options, null, $reason);
  83. if ($this->onRejected) {
  84. call_user_func($this->onRejected, $reason);
  85. }
  86. return new RejectedPromise($reason);
  87. }
  88. );
  89. }
  90. /**
  91. * Adds one or more variadic requests, exceptions, callables, or promises
  92. * to the queue.
  93. */
  94. public function append()
  95. {
  96. foreach (func_get_args() as $value) {
  97. if ($value instanceof ResponseInterface
  98. || $value instanceof \Exception
  99. || $value instanceof PromiseInterface
  100. || is_callable($value)
  101. ) {
  102. $this->queue[] = $value;
  103. } else {
  104. throw new \InvalidArgumentException('Expected a response or '
  105. . 'exception. Found ' . \GuzzleHttp\describe_type($value));
  106. }
  107. }
  108. }
  109. /**
  110. * Get the last received request.
  111. *
  112. * @return RequestInterface
  113. */
  114. public function getLastRequest()
  115. {
  116. return $this->lastRequest;
  117. }
  118. /**
  119. * Get the last received request options.
  120. *
  121. * @return RequestInterface
  122. */
  123. public function getLastOptions()
  124. {
  125. return $this->lastOptions;
  126. }
  127. /**
  128. * Returns the number of remaining items in the queue.
  129. *
  130. * @return int
  131. */
  132. public function count()
  133. {
  134. return count($this->queue);
  135. }
  136. private function invokeStats(
  137. RequestInterface $request,
  138. array $options,
  139. ResponseInterface $response = null,
  140. $reason = null
  141. ) {
  142. if (isset($options['on_stats'])) {
  143. $stats = new TransferStats($request, $response, 0, $reason);
  144. call_user_func($options['on_stats'], $stats);
  145. }
  146. }
  147. }