Details
-
Bug
-
Resolution: Unresolved
-
P1: Critical
-
None
-
6.8.0
-
None
Description
We upgraded from Qt 6.7.3 to Qt 6.8.0 and some unit tests failed.
Looks like https://codereview.qt-project.org/c/qt/qtbase/+/536614 of QTBUG-108068 breaks the previous behavior of "102 Processing" status code handling.
Our application ask the server and we expect a "102 Processing" sometimes. But the QNetworkReply won't finish anymore and we cannot get the replied information.
Here an example code to reproduce it. It will wait for another "status code" with HttpNetworkReplyPrivate::ReadingStatusState in QHttpProtocolHandler::_q_receiveReply.
#include <QtCore> #include <QtNetwork> static QTcpServer* server; static QNetworkAccessManager* manager; QByteArray getReponse() { QByteArray body; QMap<QByteArray, QByteArray> header; header.insert("Content-Length", QByteArray::number(body.size())); header.insert("Server", "Dummy/1.0"); static const auto CR_LF = QByteArrayLiteral("\r\n"); QByteArrayList list; list += QByteArrayLiteral("HTTP/1.0 102 Processing"); const auto& end = header.constEnd(); for (auto iter = header.constBegin(); iter != end; ++iter) { list += iter.key() % QByteArrayLiteral(": ") % iter.value(); } return list.join(CR_LF) % CR_LF % CR_LF % body; } void log(QNetworkReply* pReply) { qDebug() << "Status Code:" << pReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); for (const auto& [key, value] : pReply->rawHeaderPairs()) { qDebug().nospace().noquote() << "Header | " << key << ": " << value; } } void init() { qDebug() << "init"; server = new QTcpServer; server->listen(QHostAddress::LocalHost, 0); QObject::connect(server, &QTcpServer::newConnection, []{ while (server->hasPendingConnections()) { auto* socket = server->nextPendingConnection(); QObject::connect(socket, &QTcpSocket::readyRead, [socket]{ QByteArray response = getReponse(); qDebug() << "request:" << socket->readAll(); qDebug() << "write:" << response; if (socket->write(response) != response.size()) { qCritical() << "Cannot write response:" << socket->error() << '|' << socket->errorString(); } socket->flush(); //socket->close(); //socket->deleteLater(); }); } }); manager = new QNetworkAccessManager; QNetworkRequest request(QUrl(QStringLiteral("http://localhost:%1").arg(server->serverPort()))); QNetworkReply* reply = manager->get(request); QObject::connect(reply, &QNetworkReply::metaDataChanged, [reply]{ log(reply); qDebug() << "metaDataChanged:" << reply->readAll(); }); QObject::connect(reply, &QNetworkReply::readyRead, [reply]{ log(reply); qDebug() << "response:" << reply->readAll(); }); QObject::connect(reply, &QNetworkReply::finished, [reply]{ log(reply); qDebug() << "finished" << reply->readAll(); QCoreApplication::exit(0); }); } int main(int argc, char** argv) { QCoreApplication app(argc, argv); init(); return app.exec(); }