Я использую подписчиков событий в Guzzle 3 (в Goutte 1.0.6) для тестирования HTTP-операций без необходимости их выполнения. Так что, если я хочу увидеть, что происходит в 404, я просто делаю это:
class SavedPageLoaderPlugin implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return array(
'request.before_send' => 'onRequestBeforeSend',
);
}
/**
* Handles a Guzzle event before an HTTP op is attempted
*
* @param \Guzzle\Common\Event $event
* @throws \WebScraper\PauseException
*/
public function onRequestBeforeSend(Event $event)
{
// @var $request Guzzle\Http\Message\Request
$request = $event['request'];
// {{ Fetch $html and $htmlPage, removed for brevity }}
// Set a notification message for all subscribers, then set response
$response = new Response(
404,
$this->convertHeadersIntoKeyedArray($httpPage->getHeaders())
);
$response->setBody($html);
$request->setResponse($response);
}
}
Я нашел это отлично подходит для эмуляции сбоев (4xx / 5xx) и успешных операций (2xx), Guzzle правильно вызывает события успеха / неудачи на других моих плагинов в зависимости от обстоятельств.
Тем не менее, я не уверен, как сделать это с таймаутом или отказом в соединении, ни у одного из которых нет ответа (или кода состояния). я пробовал null
в качестве первого параметра Response
, но это не вызывает никаких событий; Я предполагаю, что это не понимается так же, как реальное время ожидания.
Обновление: я только что заметил в MockPlugin класс запроса имеет getEventDispatcher()
метод, который в свою очередь возвращает EventDispatcher
класс с dispatch()
метод. Похоже, это стоит изучить — все, что мне нужно сделать, это посмотреть, какие события вызваны реальными таймаутами или отказами в соединении, а затем добавить их самому в свой собственный плагин.
Я добавлю решение здесь, если у меня что-нибудь получится.
Задача ещё не решена.
Других решений пока нет …