1

Qt4.8 を使用していますが、QNetworkAccessManager を使用する既存のコードにネットワーク障害を挿入したいと考えています。ただし、このクラス、特に関連する QNetworkReply には奇妙なセマンティクスがあるようです。QNetworkAccessManager のサブクラスと QNetworkReply のサブクラスを作成しました。私の QTestNetworkAccessManager は、ベース QNetworkAccessManager によって作成されたオブジェクト、またはリスト内の次のテスト応答のいずれかを返します。

QNetworkReply *QTestNetworkAccessManager
       ::createRequest( Operation op,
                        const QNetworkRequest &req,
                        QIODevice * outgoingData )
{
    // QList<QTestNetworkReply*> m_replies;
    if (m_replies.isEmpty())
    {
        return QNetworkAccessManager::
                  createRequest( op, req, outgoingData );
    }
    QTestNetworkReply* pReply = m_replies.takeFirst();
    pReply->setUrl(req.url()); // lie about URLs
    // this sets a timer that fires finished, etc.
    pReply->queueFinished();
    return pReply;
}

単一のリクエストという単純で些細なケースでは、私のテスト コードは機能しているように見えますが、大量のネットワーク トラフィックを処理するより大きなアプリにコードを配置すると、2 つの問題が発生します。

まず、QNetworkAccessManager は、作成している QNetworkReply オブジェクトのプライベートな知識を持っているようです。(Qtソースの検査に基づく)。たとえば、さまざまなフレーバーの QHttpReplyImpl やその他のさまざまな Impl オブジェクトを作成し、それらをさまざまな方法で接続するため、私のテスト オブジェクトはその環境では適切な市民ではないようです。これにより、error() シグナルが正しく伝搬されず、メモリ空間でスタックが破損するなどの問題が発生するようです。

(QTextNetworkReply オブジェクト全体を投稿しているわけではありません。これは非常に単純であり、私の質問は特定のコードのトラブルシューティングではないためです。)

私の質問は、QNetworkAccessManager でこの種の障害注入を行って、さまざまな HTTP 障害をシミュレートできた人はいますか?

1 つ考えられたのは、HttpProxy フックを使用して、実際にソケット レベルでデータを注入するプロキシ サーバーを作成し、QHttp* オブジェクト パーサー全体をトラバースすることでしたが、それはかなり面倒に思えます。

QNetworkAccessManager に障害を挿入して、ライブ サーバーと通信しているように振る舞う簡単な方法はありませんか?

ありがとう!

PS私はhttps://blogs.kde.org/2010/08/28/implementing-reusable-custom-qnetworkreplyに精通しているため、QNAMをサブクラス化する道をたどりましたが、そうではないようですエラーのセマンティクスを正しく処理し、コードへの厄介なリンクが壊れています。

4

0 に答える 0