From kde-commits Mon Jul 19 05:17:45 2010 From: Dawit Alemayehu Date: Mon, 19 Jul 2010 05:17:45 +0000 To: kde-commits Subject: KDE/kdelibs/kioslave/http Message-Id: <20100719051746.051CAAC76B () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=127951666615836 SVN commit 1151494 by adawit: - Added a flag to make the immediately send buffered logic configurable in readBuffered. - Set this newly added flag to false when calling readBuffered from readLimited to ensure that all available data upto the required buffer size is read before sending to the client. This change addresses the recent Gmail chat problem when using kdewebkit based browsers. See http://lists.kde.org/?t=127934729000001&r=1&w=2 for details. M +8 -4 http.cpp M +1 -1 http.h --- trunk/KDE/kdelibs/kioslave/http/http.cpp #1151493:1151494 @@ -1975,7 +1975,7 @@ } } -size_t HTTPProtocol::readBuffered(char *buf, size_t size) +size_t HTTPProtocol::readBuffered(char *buf, size_t size, bool unlimited) { size_t bytesRead = 0; if (!m_unreadBuf.isEmpty()) { @@ -1987,8 +1987,11 @@ } m_unreadBuf.truncate(bufSize - bytesRead); - // if we have an unread buffer, return here, since we may already have enough data to - // complete the response, so we don't want to wait for more. + // If we have an unread buffer and the size of the content returned by the + // server is unknown, e.g. chuncked transfer, return the bytes read here since + // we may already have enough data to complete the response and don't want to + // for more. See BR# 180631. + if (unlimited) return bytesRead; } if (bytesRead < size) { @@ -4057,7 +4060,7 @@ else bytesToReceive = m_iBytesLeft; - int bytesReceived = readBuffered(m_receiveBuf.data(), bytesToReceive); + const int bytesReceived = readBuffered(m_receiveBuf.data(), bytesToReceive /*, false*/); if (bytesReceived <= 0) return -1; // Error: connection lost @@ -4148,6 +4151,7 @@ m_mimeTypeBuffer.resize(0); } + kDebug(7013) << "Sending data of size" << d.size(); data( d ); if (m_request.cacheTag.ioMode == WriteToCache) { cacheFileWritePayload(d); --- trunk/KDE/kdelibs/kioslave/http/http.h #1151493:1151494 @@ -501,7 +501,7 @@ QByteArray m_unreadBuf; void clearUnreadBuffer(); void unread(char *buf, size_t size); - size_t readBuffered(char *buf, size_t size); + size_t readBuffered(char *buf, size_t size, bool unlimited = true); bool readDelimitedText(char *buf, int *idx, int end, int numNewlines); }; #endif