Имитация сбоев сети с помощью 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, но это не похоже правильно обрабатывать семантику ошибок и неработающая ссылка на код.

0 ответов

Другие вопросы по тегам