From 554ee364b0ab37fec2c2a83a93a466cb10025230 Mon Sep 17 00:00:00 2001 From: Dominik Riebeling Date: Tue, 22 Jan 2013 20:34:33 +0100 Subject: [PATCH] Avoid unnecessary HEAD request on uncached file. If a file is not available in the cache immediately sent a GET request. Using a HEAD request to retrieve the file timestamp on the server is not necessary and only creates an unnecessary network request. Change-Id: I358507dcc0c6b837ff47e5fd710b5262d03cb7b0 --- rbutil/rbutilqt/base/httpget.cpp | 54 ++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/rbutil/rbutilqt/base/httpget.cpp b/rbutil/rbutilqt/base/httpget.cpp index 66a7076391..58f6bd5e09 100644 --- a/rbutil/rbutilqt/base/httpget.cpp +++ b/rbutil/rbutilqt/base/httpget.cpp @@ -199,6 +199,7 @@ bool HttpGet::getFile(const QUrl &url) // create hash used for caching m_hash = QCryptographicHash::hash(url.toEncoded(), QCryptographicHash::Md5).toHex(); + m_cachefile = m_cachedir.absolutePath() + "/rbutil-cache/" + m_hash; // RFC2616: the absoluteURI form must get used when the request is being // sent to a proxy. m_path.clear(); @@ -211,7 +212,7 @@ bool HttpGet::getFile(const QUrl &url) m_header.setValue("User-Agent", m_globalUserAgent); m_header.setValue("Connection", "Keep-Alive"); - if(!m_usecache) { + if(!m_usecache || !QFileInfo(m_cachefile).exists()) { getFileFinish(); } else { @@ -227,7 +228,6 @@ bool HttpGet::getFile(const QUrl &url) void HttpGet::getFileFinish() { - m_cachefile = m_cachedir.absolutePath() + "/rbutil-cache/" + m_hash; QString indexFile = m_cachedir.absolutePath() + "/rbutil-cache/cache.txt"; if(m_usecache) { // check if the file is present in cache @@ -347,35 +347,35 @@ void HttpGet::httpFinished(int id, bool error) emit requestFinished(id, error); } - if(id == headRequest) { - QHttpResponseHeader h = http.lastResponse(); - - QString date = h.value("Last-Modified").simplified(); - if(date.isEmpty()) { - m_serverTimestamp = QDateTime(); // no value = invalid + QHttpResponseHeader h = http.lastResponse(); + QString date = h.value("Last-Modified").simplified(); + if(date.isEmpty()) { + m_serverTimestamp = QDateTime(); // no value = invalid + if(id == headRequest) emit headerFinished(); - return; - } - // to successfully parse the date strip weekday and timezone - date.remove(0, date.indexOf(" ") + 1); - if(date.endsWith("GMT")) - date.truncate(date.indexOf(" GMT")); - // distinguish input formats (see RFC1945) - // RFC 850 - if(date.contains("-")) - m_serverTimestamp = QLocale::c().toDateTime(date, "dd-MMM-yy hh:mm:ss"); - // asctime format - else if(date.at(0).isLetter()) - m_serverTimestamp = QLocale::c().toDateTime(date, "MMM d hh:mm:ss yyyy"); - // RFC 822 else - m_serverTimestamp = QLocale::c().toDateTime(date, "dd MMM yyyy hh:mm:ss"); - qDebug() << "[HTTP] HEAD finished, server date:" << date << ", parsed:" << m_serverTimestamp; - emit headerFinished(); + emit requestFinished(id, error); return; } - if(id == getRequest) + // to successfully parse the date strip weekday and timezone + date.remove(0, date.indexOf(" ") + 1); + if(date.endsWith("GMT")) date.truncate(date.indexOf(" GMT")); + // distinguish input formats (see RFC1945) + if(date.contains("-")) // RFC 850 + m_serverTimestamp = QLocale::c().toDateTime(date, "dd-MMM-yy hh:mm:ss"); + else if(date.at(0).isLetter()) // asctime format + m_serverTimestamp = QLocale::c().toDateTime(date, "MMM d hh:mm:ss yyyy"); + else // RFC 822 + m_serverTimestamp = QLocale::c().toDateTime(date, "dd MMM yyyy hh:mm:ss"); + + qDebug() << "[HTTP] file server date:" << date + << "parsed:" << m_serverTimestamp; + + if(id == headRequest) + emit headerFinished(); + else emit requestFinished(id, error); + return; } void HttpGet::httpStarted(int id) @@ -396,7 +396,7 @@ void HttpGet::httpResponseHeader(const QHttpResponseHeader &resp) // if there is a network error abort all scheduled requests for // this download m_response = resp.statusCode(); - + // 301 -- moved permanently // 302 -- found // 303 -- see other -- 2.11.4.GIT