summaryrefslogtreecommitdiffstats
path: root/src/network/access/qhttpnetworkconnectionchannel.cpp
diff options
context:
space:
mode:
authorMarkus Goetz <Markus.Goetz@nokia.com>2011-07-06 16:08:59 +0200
committerQt by Nokia <qt-info@nokia.com>2011-07-12 15:34:12 +0200
commit2b5dcfcee118265ef7930cc7c5c16bff22d580fd (patch)
treea6950c1cdb3851f405ebee9da0429314b3f5866b /src/network/access/qhttpnetworkconnectionchannel.cpp
parent363c710bc438f9c0c4c0e1c3eeb9cc2d9d2af5db (diff)
QNAM HTTP: Re-write compression code
This eliminates some code (header parsing) that can be done by zlib already. Add support for 'deflate' encoding. Also do less memory copying while uncompressing. Change-Id: I94de21e3c58b904dd91d004c375ed8cbea56cb0b Task-Number: QTBUG-13191 Reviewed-on: http://codereview.qt.nokia.com/1314 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> Reviewed-by: Markus Goetz
Diffstat (limited to 'src/network/access/qhttpnetworkconnectionchannel.cpp')
-rw-r--r--src/network/access/qhttpnetworkconnectionchannel.cpp82
1 files changed, 11 insertions, 71 deletions
diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp
index aafdbf7774..8be876dd48 100644
--- a/src/network/access/qhttpnetworkconnectionchannel.cpp
+++ b/src/network/access/qhttpnetworkconnectionchannel.cpp
@@ -403,7 +403,7 @@ void QHttpNetworkConnectionChannel::_q_receiveReply()
bytes += headerBytes;
// If headers were parsed successfully now it is the ReadingDataState
if (replyPrivate->state == QHttpNetworkReplyPrivate::ReadingDataState) {
- if (replyPrivate->isGzipped() && replyPrivate->autoDecompress) {
+ if (replyPrivate->isCompressed() && replyPrivate->autoDecompress) {
// remove the Content-Length from header
replyPrivate->removeAutoDecompressHeader();
} else {
@@ -475,30 +475,18 @@ void QHttpNetworkConnectionChannel::_q_receiveReply()
{
// use the traditional slower reading (for compressed encoding, chunked encoding,
// no content-length etc)
- QByteDataBuffer byteDatas;
- qint64 haveRead = replyPrivate->readBody(socket, &byteDatas);
- if (haveRead) {
+ qint64 haveRead = replyPrivate->readBody(socket, &replyPrivate->responseData);
+ if (haveRead > 0) {
bytes += haveRead;
- if (replyPrivate->autoDecompress)
- replyPrivate->appendCompressedReplyData(byteDatas);
- else
- replyPrivate->appendUncompressedReplyData(byteDatas);
-
- if (!replyPrivate->autoDecompress) {
- replyPrivate->totalProgress += bytes;
- if (replyPrivate->shouldEmitSignals()) {
- // important: At the point of this readyRead(), the byteDatas list must be empty,
- // else implicit sharing will trigger memcpy when the user is reading data!
- emit reply->readyRead();
- emit reply->dataReadProgress(replyPrivate->totalProgress, replyPrivate->bodyLength);
- }
+ replyPrivate->totalProgress += haveRead;
+ if (replyPrivate->shouldEmitSignals()) {
+ emit reply->readyRead();
+ emit reply->dataReadProgress(replyPrivate->totalProgress, replyPrivate->bodyLength);
}
-#ifndef QT_NO_COMPRESS
- else if (!expand(false)) { // expand a chunk if possible
- // If expand() failed we can just return, it had already called connection->emitReplyError()
- return;
- }
-#endif
+ } else if (haveRead == -1) {
+ // Some error occured
+ connection->d_func()->emitReplyError(socket, reply, QNetworkReply::ProtocolFailure);
+ break;
}
}
// still in ReadingDataState? This function will be called again by the socket's readyRead
@@ -638,57 +626,9 @@ bool QHttpNetworkConnectionChannel::ensureConnection()
return true;
}
-
-#ifndef QT_NO_COMPRESS
-bool QHttpNetworkConnectionChannel::expand(bool dataComplete)
-{
- Q_ASSERT(socket);
- Q_ASSERT(reply);
-
- qint64 total = reply->d_func()->compressedData.size();
- if (total >= CHUNK || dataComplete) {
- // uncompress the data
- QByteArray content, inflated;
- content = reply->d_func()->compressedData;
- reply->d_func()->compressedData.clear();
-
- int ret = Z_OK;
- if (content.size())
- ret = reply->d_func()->gunzipBodyPartially(content, inflated);
- int retCheck = (dataComplete) ? Z_STREAM_END : Z_OK;
- if (ret >= retCheck) {
- if (inflated.size()) {
- reply->d_func()->totalProgress += inflated.size();
- reply->d_func()->appendUncompressedReplyData(inflated);
- if (reply->d_func()->shouldEmitSignals()) {
- // important: At the point of this readyRead(), inflated must be cleared,
- // else implicit sharing will trigger memcpy when the user is reading data!
- emit reply->readyRead();
- emit reply->dataReadProgress(reply->d_func()->totalProgress, 0);
- }
- }
- } else {
- connection->d_func()->emitReplyError(socket, reply, QNetworkReply::ProtocolFailure);
- return false;
- }
- }
- return true;
-}
-#endif
-
-
void QHttpNetworkConnectionChannel::allDone()
{
Q_ASSERT(reply);
-#ifndef QT_NO_COMPRESS
- // expand the whole data.
- if (reply->d_func()->expectContent() && reply->d_func()->autoDecompress && !reply->d_func()->streamEnd) {
- bool expandResult = expand(true);
- // If expand() failed we can just return, it had already called connection->emitReplyError()
- if (!expandResult)
- return;
- }
-#endif
if (!reply) {
qWarning() << "QHttpNetworkConnectionChannel::allDone() called without reply. Please report at http://bugreports.qt.nokia.com/";