Имитация сбоев сети с помощью QNetworkAccessManager & QNetworkReply
Я использую 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;
}
В простом, тривиальном случае одного запроса мой тестовый код, кажется, работает, но две проблемы обнаруживаются, когда я помещаю его в более крупное приложение, выполняющее много сетевого трафика.
Во-первых, QNetworkAccessManager, похоже, обладает личными знаниями об объектах QNetworkReply, которые он создает. (основано на проверке источника Qt). Например, он создает различные разновидности QHttpReplyImpl и различные другие объекты Impl и подключает их различными способами, поэтому мои тестовые объекты не кажутся хорошими гражданами в этой среде. Это, кажется, вызывает проблемы, такие как ошибки (), сигналы распространяются неправильно, и мое пространство памяти испытывает повреждение стека.
(Я не публикую весь объект QTextNetworkReply, потому что это довольно просто, и мой вопрос не в том, чтобы устранить мой конкретный код.)
У меня такой вопрос: кто-нибудь делал подобные инъекции с помощью QNetworkAccessManager и смог имитировать различные ошибки HTTP.
Одна мысль заключалась в том, чтобы использовать перехватчики HttpProxy для создания прокси-сервера, который фактически внедряет данные на уровне сокетов, чтобы обойти весь анализатор объектов QHttp*, но это кажется большой проблемой.
Неужели нет более простого способа внедрить ошибки в QNetworkAccessManager, чтобы он действовал так, как будто он общается с живым сервером?
Спасибо!
PS Я знаком с https://blogs.kde.org/2010/08/28/implementing-reusable-custom-qnetworkreply поэтому я пошел по дороге, я нахожусь в подклассе QNAM, но это не похоже правильно обрабатывать семантику ошибок и неработающая ссылка на код.