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:
parent
e11fac22c4
commit
37be55a86f
@ -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
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user