Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-130666

[Regr:6.7.3->6.8.0] QNetworkReply never finished

    XMLWordPrintable

Details

    • Bug
    • Resolution: Unresolved
    • P1: Critical
    • None
    • 6.8.0
    • Network: HTTP
    • 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();
      }
      

      Attachments

        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

        Activity

          People

            manordheim Mårten Nordheim
            misery André Klitzing
            Vladimir Minenko Vladimir Minenko
            Alex Blasche Alex Blasche
            Votes:
            1 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:

              Gerrit Reviews

                There are no open Gerrit changes