0

我在 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中注意到 Request 类有一个getEventDispatcher()方法,该方法又返回一个EventDispatcher带有dispatch()方法的类。这听起来值得研究——我需要做的就是查看真正的超时或连接拒绝触发了哪些事件,然后自己将它们放入自定义插件中。

如果我有任何工作,我会在这里添加一个解决方案。

4

0 回答 0