summaryrefslogtreecommitdiffstats
path: root/src/network
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar@trolltech.com>2009-10-26 07:06:59 (GMT)
committerGunnar Sletta <gunnar@trolltech.com>2009-10-26 07:06:59 (GMT)
commit9a1ee410d24321e7eedaea6bb4f1b21fcc6fb427 (patch)
tree37ae0ceb0eb9d4f74683b02bf3187cfd7f694c6c /src/network
parent2c0921b667ec74df6ad3d749b30bb9b7c5843343 (diff)
parent35c8033ff51ab6d0567e786b790b8cc49852803b (diff)
downloadQt-9a1ee410d24321e7eedaea6bb4f1b21fcc6fb427.zip
Qt-9a1ee410d24321e7eedaea6bb4f1b21fcc6fb427.tar.gz
Qt-9a1ee410d24321e7eedaea6bb4f1b21fcc6fb427.tar.bz2
Merge branch '4.6' of git@scm.dev.nokia.troll.no:qt/qt into 4.6
Diffstat (limited to 'src/network')
-rw-r--r--src/network/access/qhttp.cpp28
-rw-r--r--src/network/access/qhttp.h3
-rw-r--r--src/network/ssl/qsslsocket.cpp15
-rw-r--r--src/network/ssl/qsslsocket.h1
-rw-r--r--src/network/ssl/qsslsocket_p.h1
5 files changed, 48 insertions, 0 deletions
diff --git a/src/network/access/qhttp.cpp b/src/network/access/qhttp.cpp
index 69faee3..f006fba 100644
--- a/src/network/access/qhttp.cpp
+++ b/src/network/access/qhttp.cpp
@@ -121,6 +121,9 @@ public:
void _q_slotError(QAbstractSocket::SocketError);
void _q_slotClosed();
void _q_slotBytesWritten(qint64 numBytes);
+#ifndef QT_NO_OPENSSL
+ void _q_slotEncryptedBytesWritten(qint64 numBytes);
+#endif
void _q_slotDoFinished();
void _q_slotSendRequest();
void _q_continuePost();
@@ -135,6 +138,8 @@ public:
void closeConn();
void setSock(QTcpSocket *sock);
+ void postMoreData();
+
QTcpSocket *socket;
int reconnectAttempts;
bool deleteSocket;
@@ -2659,19 +2664,40 @@ void QHttpPrivate::_q_slotError(QAbstractSocket::SocketError err)
closeConn();
}
+#ifndef QT_NO_OPENSSL
+void QHttpPrivate::_q_slotEncryptedBytesWritten(qint64 written)
+{
+ Q_UNUSED(written);
+ postMoreData();
+}
+#endif
+
void QHttpPrivate::_q_slotBytesWritten(qint64 written)
{
Q_Q(QHttp);
bytesDone += written;
emit q->dataSendProgress(bytesDone, bytesTotal);
+ postMoreData();
+}
+// Send the POST data
+void QHttpPrivate::postMoreData()
+{
if (pendingPost)
return;
if (!postDevice)
return;
+ // the following is backported code from Qt 4.6 QNetworkAccessManager.
+ // We also have to check the encryptedBytesToWrite() if it is an SSL socket.
+#ifndef QT_NO_OPENSSL
+ QSslSocket *sslSocket = qobject_cast<QSslSocket*>(socket);
+ // if it is really an ssl socket, check more than just bytesToWrite()
+ if ((socket->bytesToWrite() + (sslSocket ? sslSocket->encryptedBytesToWrite() : 0)) == 0) {
+#else
if (socket->bytesToWrite() == 0) {
+#endif
int max = qMin<qint64>(4096, postDevice->size() - postDevice->pos());
QByteArray arr;
arr.resize(max);
@@ -3097,6 +3123,8 @@ void QHttpPrivate::setSock(QTcpSocket *sock)
if (qobject_cast<QSslSocket *>(socket)) {
QObject::connect(socket, SIGNAL(sslErrors(const QList<QSslError> &)),
q, SIGNAL(sslErrors(const QList<QSslError> &)));
+ QObject::connect(socket, SIGNAL(encryptedBytesWritten(qint64)),
+ q, SLOT(_q_slotEncryptedBytesWritten(qint64)));
}
#endif
}
diff --git a/src/network/access/qhttp.h b/src/network/access/qhttp.h
index e5061ca..f30def2 100644
--- a/src/network/access/qhttp.h
+++ b/src/network/access/qhttp.h
@@ -290,6 +290,9 @@ private:
Q_PRIVATE_SLOT(d_func(), void _q_slotError(QAbstractSocket::SocketError))
Q_PRIVATE_SLOT(d_func(), void _q_slotClosed())
Q_PRIVATE_SLOT(d_func(), void _q_slotBytesWritten(qint64 numBytes))
+#ifndef QT_NO_OPENSSL
+ Q_PRIVATE_SLOT(d_func(), void _q_slotEncryptedBytesWritten(qint64 numBytes))
+#endif
Q_PRIVATE_SLOT(d_func(), void _q_slotDoFinished())
Q_PRIVATE_SLOT(d_func(), void _q_slotSendRequest())
Q_PRIVATE_SLOT(d_func(), void _q_continuePost())
diff --git a/src/network/ssl/qsslsocket.cpp b/src/network/ssl/qsslsocket.cpp
index ad766c1..2c88130 100644
--- a/src/network/ssl/qsslsocket.cpp
+++ b/src/network/ssl/qsslsocket.cpp
@@ -1740,6 +1740,11 @@ qint64 QSslSocket::readData(char *data, qint64 maxlen)
#ifdef QSSLSOCKET_DEBUG
qDebug() << "QSslSocket::readData(" << (void *)data << ',' << maxlen << ") ==" << readBytes;
#endif
+
+ // possibly trigger another transmit() to decrypt more data from the socket
+ if (d->readBuffer.isEmpty() && d->plainSocket->bytesAvailable())
+ QMetaObject::invokeMethod(this, "_q_flushReadBuffer", Qt::QueuedConnection);
+
return readBytes;
}
@@ -2134,6 +2139,16 @@ void QSslSocketPrivate::_q_flushWriteBuffer()
q->flush();
}
+/*!
+ \internal
+*/
+void QSslSocketPrivate::_q_flushReadBuffer()
+{
+ // trigger a read from the plainSocket into SSL
+ if (mode != QSslSocket::UnencryptedMode)
+ transmit();
+}
+
QT_END_NAMESPACE
// For private slots
diff --git a/src/network/ssl/qsslsocket.h b/src/network/ssl/qsslsocket.h
index adb206c..82cda35 100644
--- a/src/network/ssl/qsslsocket.h
+++ b/src/network/ssl/qsslsocket.h
@@ -207,6 +207,7 @@ private:
Q_PRIVATE_SLOT(d_func(), void _q_readyReadSlot())
Q_PRIVATE_SLOT(d_func(), void _q_bytesWrittenSlot(qint64))
Q_PRIVATE_SLOT(d_func(), void _q_flushWriteBuffer())
+ Q_PRIVATE_SLOT(d_func(), void _q_flushReadBuffer())
friend class QSslSocketBackendPrivate;
};
diff --git a/src/network/ssl/qsslsocket_p.h b/src/network/ssl/qsslsocket_p.h
index 24d4ebe..ee21956 100644
--- a/src/network/ssl/qsslsocket_p.h
+++ b/src/network/ssl/qsslsocket_p.h
@@ -120,6 +120,7 @@ public:
void _q_readyReadSlot();
void _q_bytesWrittenSlot(qint64);
void _q_flushWriteBuffer();
+ void _q_flushReadBuffer();
// Platform specific functions
virtual void startClientEncryption() = 0;