QNAM HTTP: Fix upload progress signal
This commit is contained in:
parent
a5562d345b
commit
5b2b0a7b35
@ -1736,7 +1736,7 @@ QNonContiguousByteDevice* QNetworkReplyHttpImplPrivate::createUploadByteDevice()
|
|||||||
uploadByteDevice->disableReset();
|
uploadByteDevice->disableReset();
|
||||||
|
|
||||||
// We want signal emissions only for normal asynchronous uploads
|
// We want signal emissions only for normal asynchronous uploads
|
||||||
if (synchronous)
|
if (!synchronous)
|
||||||
QObject::connect(uploadByteDevice.data(), SIGNAL(readProgress(qint64,qint64)),
|
QObject::connect(uploadByteDevice.data(), SIGNAL(readProgress(qint64,qint64)),
|
||||||
q, SLOT(emitReplyUploadProgress(qint64,qint64)));
|
q, SLOT(emitReplyUploadProgress(qint64,qint64)));
|
||||||
|
|
||||||
|
@ -4162,6 +4162,7 @@ public:
|
|||||||
|
|
||||||
if (serverSocket->setSocketDescriptor(socketDescriptor)) {
|
if (serverSocket->setSocketDescriptor(socketDescriptor)) {
|
||||||
connect(serverSocket, SIGNAL(encrypted()), this, SLOT(encryptedSlot()));
|
connect(serverSocket, SIGNAL(encrypted()), this, SLOT(encryptedSlot()));
|
||||||
|
connect(serverSocket, SIGNAL(readyRead()), this, SLOT(readyReadSlot()));
|
||||||
serverSocket->setProtocol(QSsl::AnyProtocol);
|
serverSocket->setProtocol(QSsl::AnyProtocol);
|
||||||
connect(serverSocket, SIGNAL(sslErrors(const QList<QSslError>&)), serverSocket, SLOT(ignoreSslErrors()));
|
connect(serverSocket, SIGNAL(sslErrors(const QList<QSslError>&)), serverSocket, SLOT(ignoreSslErrors()));
|
||||||
serverSocket->setLocalCertificate(SRCDIR "/certs/server.pem");
|
serverSocket->setLocalCertificate(SRCDIR "/certs/server.pem");
|
||||||
@ -4178,6 +4179,11 @@ public slots:
|
|||||||
socket = (QSslSocket*) sender();
|
socket = (QSslSocket*) sender();
|
||||||
emit newEncryptedConnection();
|
emit newEncryptedConnection();
|
||||||
}
|
}
|
||||||
|
void readyReadSlot() {
|
||||||
|
// for the incoming sockets, not the server socket
|
||||||
|
//qDebug() << static_cast<QSslSocket*>(sender())->bytesAvailable() << static_cast<QSslSocket*>(sender())->encryptedBytesAvailable();
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
QSslSocket *socket;
|
QSslSocket *socket;
|
||||||
};
|
};
|
||||||
@ -4185,8 +4191,15 @@ public:
|
|||||||
// very similar to ioPostToHttpUploadProgress but for SSL
|
// very similar to ioPostToHttpUploadProgress but for SSL
|
||||||
void tst_QNetworkReply::ioPostToHttpsUploadProgress()
|
void tst_QNetworkReply::ioPostToHttpsUploadProgress()
|
||||||
{
|
{
|
||||||
QFile sourceFile(SRCDIR "/bigfile");
|
//QFile sourceFile(SRCDIR "/bigfile");
|
||||||
QVERIFY(sourceFile.open(QIODevice::ReadOnly));
|
//QVERIFY(sourceFile.open(QIODevice::ReadOnly));
|
||||||
|
qint64 wantedSize = 2*1024*1024; // 2 MB
|
||||||
|
QByteArray sourceFile;
|
||||||
|
// And in the case of SSL, the compression can fool us and let the
|
||||||
|
// server send the data much faster than expected.
|
||||||
|
// So better provide random data that cannot be compressed.
|
||||||
|
for (int i = 0; i < wantedSize; ++i)
|
||||||
|
sourceFile += (char)qrand();
|
||||||
|
|
||||||
// emulate a minimal https server
|
// emulate a minimal https server
|
||||||
SslServer server;
|
SslServer server;
|
||||||
@ -4195,8 +4208,10 @@ void tst_QNetworkReply::ioPostToHttpsUploadProgress()
|
|||||||
// create the request
|
// create the request
|
||||||
QUrl url = QUrl(QString("https://127.0.0.1:%1/").arg(server.serverPort()));
|
QUrl url = QUrl(QString("https://127.0.0.1:%1/").arg(server.serverPort()));
|
||||||
QNetworkRequest request(url);
|
QNetworkRequest request(url);
|
||||||
|
|
||||||
request.setRawHeader("Content-Type", "application/octet-stream");
|
request.setRawHeader("Content-Type", "application/octet-stream");
|
||||||
QNetworkReplyPtr reply = manager.post(request, &sourceFile);
|
QNetworkReplyPtr reply = manager.post(request, sourceFile);
|
||||||
|
|
||||||
QSignalSpy spy(reply, SIGNAL(uploadProgress(qint64,qint64)));
|
QSignalSpy spy(reply, SIGNAL(uploadProgress(qint64,qint64)));
|
||||||
connect(&server, SIGNAL(newEncryptedConnection()), &QTestEventLoop::instance(), SLOT(exitLoop()));
|
connect(&server, SIGNAL(newEncryptedConnection()), &QTestEventLoop::instance(), SLOT(exitLoop()));
|
||||||
connect(reply, SIGNAL(sslErrors(const QList<QSslError>&)), reply, SLOT(ignoreSslErrors()));
|
connect(reply, SIGNAL(sslErrors(const QList<QSslError>&)), reply, SLOT(ignoreSslErrors()));
|
||||||
@ -4215,26 +4230,17 @@ void tst_QNetworkReply::ioPostToHttpsUploadProgress()
|
|||||||
QVERIFY(!spy.isEmpty());
|
QVERIFY(!spy.isEmpty());
|
||||||
QList<QVariant> args = spy.last();
|
QList<QVariant> args = spy.last();
|
||||||
QVERIFY(args.at(0).toLongLong() > 0);
|
QVERIFY(args.at(0).toLongLong() > 0);
|
||||||
|
// but not everything!
|
||||||
QVERIFY(args.at(0).toLongLong() != sourceFile.size());
|
QVERIFY(args.at(0).toLongLong() != sourceFile.size());
|
||||||
|
|
||||||
incomingSocket->setReadBufferSize(32*1024);
|
|
||||||
incomingSocket->read(16*1024);
|
|
||||||
QTestEventLoop::instance().enterLoop(2);
|
|
||||||
// some more progress than before
|
|
||||||
QVERIFY(!spy.isEmpty());
|
|
||||||
QList<QVariant> args2 = spy.last();
|
|
||||||
QVERIFY(args2.at(0).toLongLong() > args.at(0).toLongLong());
|
|
||||||
|
|
||||||
// set the read buffer to unlimited
|
// set the read buffer to unlimited
|
||||||
incomingSocket->setReadBufferSize(0);
|
incomingSocket->setReadBufferSize(0);
|
||||||
QTestEventLoop::instance().enterLoop(10);
|
QTestEventLoop::instance().enterLoop(10);
|
||||||
// progress should be finished
|
// progress should be finished
|
||||||
QVERIFY(!spy.isEmpty());
|
QVERIFY(!spy.isEmpty());
|
||||||
QList<QVariant> args3 = spy.last();
|
QList<QVariant> args3 = spy.last();
|
||||||
QVERIFY(args3.at(0).toLongLong() > args2.at(0).toLongLong());
|
|
||||||
QCOMPARE(args3.at(0).toLongLong(), args3.at(1).toLongLong());
|
QCOMPARE(args3.at(0).toLongLong(), args3.at(1).toLongLong());
|
||||||
QCOMPARE(args3.at(0).toLongLong(), sourceFile.size());
|
QCOMPARE(args3.at(0).toLongLong(), qint64(sourceFile.size()));
|
||||||
|
|
||||||
// after sending this, the QNAM should emit finished()
|
// after sending this, the QNAM should emit finished()
|
||||||
connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
|
connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
|
||||||
|
Loading…
Reference in New Issue
Block a user