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