Я использую 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, чтобы он действовал так, как будто он общается с живым сервером?
Спасибо!
Постскриптум Я знаком с https://blogs.kde.org/2010/08/28/implementing-reusable-custom-qnetworkreply вот почему я пошел по пути подкласса QNAM, но, похоже, он неправильно обрабатывает семантику ошибок, и полезная ссылка на код не работает.
Задача ещё не решена.