From kde-commits Thu Dec 23 06:48:47 2010 From: Dawit Alemayehu Date: Thu, 23 Dec 2010 06:48:47 +0000 To: kde-commits Subject: KDE/kdelibs/kioslave/http Message-Id: <20101223064847.172153E1F1 () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=129308697029756 SVN commit 1208765 by adawit: A correct version of the rr1208112 commit. This should not break existing behavior. CCMAIL:ahartmetz@gmail.com M +32 -18 http.cpp M +1 -1 http.h --- trunk/KDE/kdelibs/kioslave/http/http.cpp #1208764:1208765 @@ -2548,15 +2548,17 @@ return res; } -void HTTPProtocol::forwardHttpResponseHeader() +void HTTPProtocol::forwardHttpResponseHeader(bool forwardImmediately) { - // Send the response header if it was requested - if ( config()->readEntry("PropagateHttpHeader", false) ) - { + // Send the response header if it was requested... + if (!config()->readEntry("PropagateHttpHeader", false)) + return; + setMetaData(QLatin1String("HTTP-Headers"), m_responseHeaders.join(QString(QLatin1Char('\n')))); + + if (forwardImmediately) sendMetaData(); } -} bool HTTPProtocol::parseHeaderFromCache() { @@ -2589,7 +2591,10 @@ // this header comes from the cache, so the response must have been cacheable :) setCacheabilityMetadata(true); kDebug(7113) << "Emitting mimeType" << m_mimeType; + forwardHttpResponseHeader(false); mimeType(m_mimeType); + // IMPORTANT: Do not remove the call below or the http response headers will + // not be available to the application if this slave is put on hold. forwardHttpResponseHeader(); return true; } @@ -3488,15 +3493,6 @@ return parseHeaderFromCache(); } - // Let the app know about the mime-type iff this is not - // a redirection and the mime-type string is not empty. - if (!m_isRedirection && - (!m_mimeType.isEmpty() || m_request.method == HTTP_HEAD) && - (m_isLoadingErrorPage || !authRequiresAnotherRoundtrip)) { - kDebug(7113) << "Emitting mimetype " << m_mimeType; - mimeType( m_mimeType ); - } - if (config()->readEntry("PropagateHttpHeader", false) || m_request.cacheTag.ioMode == WriteToCache) { // store header lines if they will be used; note that the tokenizer removing @@ -3515,15 +3511,33 @@ prevLineEnd - prevLinePos)); prevLinePos = nextLinePos; } + + // IMPORTNAT: Do not remove this line because forwardHttpResponseHeader + // is called below. This line is added to make http response headers are + // available by the time the content mimetype information is transmitted + // to the job. If the line below is removed, the KIO-QNAM integration + // will not work properly when attempting to put ioslaves on hold. + setMetaData(QLatin1String("HTTP-Headers"), m_responseHeaders.join(QString(QLatin1Char('\n')))); } - // Do not move send response header before any redirection as it seems - // to screw up some sites. See BR# 150904. + // Let the app know about the mime-type iff this is not a redirection and + // the mime-type string is not empty. + if (!m_isRedirection && + (!m_mimeType.isEmpty() || m_request.method == HTTP_HEAD) && + (m_isLoadingErrorPage || !authRequiresAnotherRoundtrip)) { + kDebug(7113) << "Emitting mimetype " << m_mimeType; + mimeType( m_mimeType ); + } + + // Do not move the function call below before doing any redirection. + // Otherwise it might mess up some sites. See BR# 150904. + // IMPORTANT: Do not remove it either thinking it duplicates what is done + // above. Otherwise, the http response headers will not be available if + // this ioslave is put on hold. forwardHttpResponseHeader(); - if (m_request.method == HTTP_HEAD) { + if (m_request.method == HTTP_HEAD) return true; - } return !authRequiresAnotherRoundtrip; // return true if no more credentials need to be sent } --- trunk/KDE/kdelibs/kioslave/http/http.h #1208764:1208765 @@ -331,7 +331,7 @@ void httpCloseConnection(); // Close connection bool httpShouldCloseConnection(); // Check whether to keep or close the connection. - void forwardHttpResponseHeader(); + void forwardHttpResponseHeader(bool forwardImmediately = true); // Helpers for readResponseHeader - fix common mimetype/content-encoding errors by webservers. void fixupResponseMimetype();