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をサブクラス化する道をたどりましたが、そうではないようですエラーのセマンティクスを正しく処理し、コードへの厄介なリンクが壊れています。