QNAM HTTP: Do zero-copy for small HTTP replies by default

Task-Number: QTBUG-19046

Change-Id: I34bf432c81d94787524124b7d110a00305a660c1
Reviewed-on: http://codereview.qt.nokia.com/1516
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Martin Petersson <Martin.Petersson@nokia.com>
Reviewed-by: Peter Hartmann <peter.hartmann@nokia.com>
This commit is contained in:
Markus Goetz 2011-07-12 12:45:02 +02:00 committed by Qt by Nokia
parent e11fac22c4
commit 37be55a86f
3 changed files with 22 additions and 9 deletions

View File

@ -448,12 +448,17 @@ void QHttpNetworkConnectionChannel::_q_receiveReply()
// the buffer in that size. // the buffer in that size.
// note that this call will read only from the still buffered data // note that this call will read only from the still buffered data
qint64 haveRead = replyPrivate->readBodyVeryFast(socket, replyPrivate->userProvidedDownloadBuffer + replyPrivate->totalProgress); qint64 haveRead = replyPrivate->readBodyVeryFast(socket, replyPrivate->userProvidedDownloadBuffer + replyPrivate->totalProgress);
bytes += haveRead; if (haveRead > 0) {
replyPrivate->totalProgress += haveRead; bytes += haveRead;
replyPrivate->totalProgress += haveRead;
// the user will get notified of it via progress signal // the user will get notified of it via progress signal
if (haveRead > 0)
emit reply->dataReadProgress(replyPrivate->totalProgress, replyPrivate->bodyLength); emit reply->dataReadProgress(replyPrivate->totalProgress, replyPrivate->bodyLength);
} else if (haveRead == 0) {
// Happens since this called in a loop. Currently no bytes available.
} else if (haveRead < 0) {
connection->d_func()->emitReplyError(socket, reply, QNetworkReply::RemoteHostClosedError);
break;
}
} else if (!replyPrivate->isChunked() && !replyPrivate->autoDecompress } else if (!replyPrivate->isChunked() && !replyPrivate->autoDecompress
&& replyPrivate->bodyLength > 0) { && replyPrivate->bodyLength > 0) {
// bulk files like images should fulfill these properties and // bulk files like images should fulfill these properties and

View File

@ -211,7 +211,7 @@ void QHttpNetworkReply::setDownstreamLimited(bool dsl)
bool QHttpNetworkReply::supportsUserProvidedDownloadBuffer() bool QHttpNetworkReply::supportsUserProvidedDownloadBuffer()
{ {
Q_D(QHttpNetworkReply); Q_D(QHttpNetworkReply);
return (!d->isChunked() && !d->autoDecompress && d->bodyLength > 0); return (!d->isChunked() && !d->autoDecompress && d->bodyLength > 0 && d->statusCode == 200);
} }
void QHttpNetworkReply::setUserProvidedDownloadBuffer(char* b) void QHttpNetworkReply::setUserProvidedDownloadBuffer(char* b)
@ -672,7 +672,7 @@ qint64 QHttpNetworkReplyPrivate::readBodyVeryFast(QAbstractSocket *socket, char
qint64 haveRead = 0; qint64 haveRead = 0;
haveRead = socket->read(b, bodyLength - contentRead); haveRead = socket->read(b, bodyLength - contentRead);
if (haveRead == -1) { if (haveRead == -1) {
return 0; // ### error checking here; return -1;
} }
contentRead += haveRead; contentRead += haveRead;

View File

@ -777,8 +777,16 @@ void QNetworkReplyHttpImplPrivate::postRequest()
if (!synchronous) { if (!synchronous) {
// Tell our zerocopy policy to the delegate // Tell our zerocopy policy to the delegate
delegate->downloadBufferMaximumSize = QVariant downloadBufferMaximumSizeAttribute = request.attribute(QNetworkRequest::MaximumDownloadBufferSizeAttribute);
request.attribute(QNetworkRequest::MaximumDownloadBufferSizeAttribute).toLongLong(); if (downloadBufferMaximumSizeAttribute.isValid()) {
delegate->downloadBufferMaximumSize = downloadBufferMaximumSizeAttribute.toLongLong();
} else {
// If there is no MaximumDownloadBufferSizeAttribute set (which is for the majority
// of QNetworkRequest) then we can assume we'll do it anyway for small HTTP replies.
// This helps with performance and memory fragmentation.
delegate->downloadBufferMaximumSize = 128*1024;
}
// These atomic integers are used for signal compression // These atomic integers are used for signal compression
delegate->pendingDownloadData = pendingDownloadDataEmissions; delegate->pendingDownloadData = pendingDownloadDataEmissions;