/usr/share/php/Guzzle/Plugin/Mock/MockPlugin.php is in php-guzzle 3.7.0-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 | <?php
namespace Guzzle\Plugin\Mock;
use Guzzle\Common\Event;
use Guzzle\Common\Exception\InvalidArgumentException;
use Guzzle\Common\AbstractHasDispatcher;
use Guzzle\Http\Exception\CurlException;
use Guzzle\Http\Message\RequestInterface;
use Guzzle\Http\Message\EntityEnclosingRequestInterface;
use Guzzle\Http\Message\Response;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Queues mock responses or exceptions and delivers mock responses or exceptions in a fifo order.
*/
class MockPlugin extends AbstractHasDispatcher implements EventSubscriberInterface, \Countable
{
/** @var array Array of mock responses / exceptions */
protected $queue = array();
/** @var bool Whether or not to remove the plugin when the queue is empty */
protected $temporary = false;
/** @var array Array of requests that were mocked */
protected $received = array();
/** @var bool Whether or not to consume an entity body when a mock response is served */
protected $readBodies;
/**
* @param array $items Array of responses or exceptions to queue
* @param bool $temporary Set to TRUE to remove the plugin when the queue is empty
* @param bool $readBodies Set to TRUE to consume the entity body when a mock is served
*/
public function __construct(array $items = null, $temporary = false, $readBodies = false)
{
$this->readBodies = $readBodies;
$this->temporary = $temporary;
if ($items) {
foreach ($items as $item) {
if ($item instanceof \Exception) {
$this->addException($item);
} else {
$this->addResponse($item);
}
}
}
}
public static function getSubscribedEvents()
{
// Use a number lower than the CachePlugin
return array('request.before_send' => array('onRequestBeforeSend', -999));
}
public static function getAllEvents()
{
return array('mock.request');
}
/**
* Get a mock response from a file
*
* @param string $path File to retrieve a mock response from
*
* @return Response
* @throws InvalidArgumentException if the file is not found
*/
public static function getMockFile($path)
{
if (!file_exists($path)) {
throw new InvalidArgumentException('Unable to open mock file: ' . $path);
}
return Response::fromMessage(file_get_contents($path));
}
/**
* Set whether or not to consume the entity body of a request when a mock
* response is used
*
* @param bool $readBodies Set to true to read and consume entity bodies
*
* @return self
*/
public function readBodies($readBodies)
{
$this->readBodies = $readBodies;
return $this;
}
/**
* Returns the number of remaining mock responses
*
* @return int
*/
public function count()
{
return count($this->queue);
}
/**
* Add a response to the end of the queue
*
* @param string|Response $response Response object or path to response file
*
* @return MockPlugin
* @throws InvalidArgumentException if a string or Response is not passed
*/
public function addResponse($response)
{
if (!($response instanceof Response)) {
if (!is_string($response)) {
throw new InvalidArgumentException('Invalid response');
}
$response = self::getMockFile($response);
}
$this->queue[] = $response;
return $this;
}
/**
* Add an exception to the end of the queue
*
* @param CurlException $e Exception to throw when the request is executed
*
* @return MockPlugin
*/
public function addException(CurlException $e)
{
$this->queue[] = $e;
return $this;
}
/**
* Clear the queue
*
* @return MockPlugin
*/
public function clearQueue()
{
$this->queue = array();
return $this;
}
/**
* Returns an array of mock responses remaining in the queue
*
* @return array
*/
public function getQueue()
{
return $this->queue;
}
/**
* Check if this is a temporary plugin
*
* @return bool
*/
public function isTemporary()
{
return $this->temporary;
}
/**
* Get a response from the front of the list and add it to a request
*
* @param RequestInterface $request Request to mock
*
* @return self
* @throws CurlException When request.send is called and an exception is queued
*/
public function dequeue(RequestInterface $request)
{
$this->dispatch('mock.request', array('plugin' => $this, 'request' => $request));
$item = array_shift($this->queue);
if ($item instanceof Response) {
if ($this->readBodies && $request instanceof EntityEnclosingRequestInterface) {
$request->getEventDispatcher()->addListener('request.sent', $f = function (Event $event) use (&$f) {
while ($data = $event['request']->getBody()->read(8096));
// Remove the listener after one-time use
$event['request']->getEventDispatcher()->removeListener('request.sent', $f);
});
}
$request->setResponse($item);
} elseif ($item instanceof CurlException) {
// Emulates exceptions encountered while transferring requests
$item->setRequest($request);
$state = $request->setState(RequestInterface::STATE_ERROR, array('exception' => $item));
// Only throw if the exception wasn't handled
if ($state == RequestInterface::STATE_ERROR) {
throw $item;
}
}
return $this;
}
/**
* Clear the array of received requests
*/
public function flush()
{
$this->received = array();
}
/**
* Get an array of requests that were mocked by this plugin
*
* @return array
*/
public function getReceivedRequests()
{
return $this->received;
}
/**
* Called when a request is about to be sent
*
* @param Event $event
*/
public function onRequestBeforeSend(Event $event)
{
if ($this->queue) {
$request = $event['request'];
$this->received[] = $request;
// Detach the filter from the client so it's a one-time use
if ($this->temporary && count($this->queue) == 1 && $request->getClient()) {
$request->getClient()->getEventDispatcher()->removeSubscriber($this);
}
$this->dequeue($request);
}
}
}
|