summaryrefslogtreecommitdiffstats
path: root/src/network/access/qnetworkaccesshttpbackend.cpp
diff options
context:
space:
mode:
authorQt Continuous Integration System <qt-info@nokia.com>2010-02-20 14:22:55 (GMT)
committerQt Continuous Integration System <qt-info@nokia.com>2010-02-20 14:22:55 (GMT)
commitf1671303b3da7cfe8532699541ae8dd41e122f8e (patch)
tree8dec43bea3747d3f8809eb9089a78ba78adef4e5 /src/network/access/qnetworkaccesshttpbackend.cpp
parentd05f83919949fd9604e6d96858a8404c9a580def (diff)
parent1449a1b84f12d937b56ae2b9f4a3ba3dc704281e (diff)
downloadQt-f1671303b3da7cfe8532699541ae8dd41e122f8e.zip
Qt-f1671303b3da7cfe8532699541ae8dd41e122f8e.tar.gz
Qt-f1671303b3da7cfe8532699541ae8dd41e122f8e.tar.bz2
Merge branch 'master' of scm.dev.nokia.troll.no:qt/mobility-staging into master-integration
* 'master' of scm.dev.nokia.troll.no:qt/mobility-staging: (114 commits) Create unit-test in parent directory. Allow QNAM to be created as a global variable. Don't load NetworkManager plugin in NetworkManager is not available. Disable NLA plugin, build generic on win32 and mac. Fix QNetworkSession unit test. Fix segfault. Remove debug output. Make this a warning. Don't block forever if no bearer plugins are loaded. Always build generic plugin when building NetworkManager plugin. Add QT_MODULE headers. Change docs: "phone" -> "device". Remove unused code. Simplify. Optimise iterations over QHash. Use snippets. Reorder members to remove hole. Expand documentation for QNAM::setConfiguration() and friends. Fix build on Windows, typo. Fix build on Windows. ...
Diffstat (limited to 'src/network/access/qnetworkaccesshttpbackend.cpp')
-rw-r--r--src/network/access/qnetworkaccesshttpbackend.cpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/network/access/qnetworkaccesshttpbackend.cpp b/src/network/access/qnetworkaccesshttpbackend.cpp
index c8f4e5b..c53e757 100644
--- a/src/network/access/qnetworkaccesshttpbackend.cpp
+++ b/src/network/access/qnetworkaccesshttpbackend.cpp
@@ -297,6 +297,7 @@ QNetworkAccessHttpBackend::QNetworkAccessHttpBackend()
#ifndef QT_NO_OPENSSL
, pendingSslConfiguration(0), pendingIgnoreAllSslErrors(false)
#endif
+ , resumeOffset(0)
{
}
@@ -542,6 +543,28 @@ void QNetworkAccessHttpBackend::postRequest()
httpRequest.setUrl(url());
QList<QByteArray> headers = request().rawHeaderList();
+ if (resumeOffset != 0) {
+ if (headers.contains("Range")) {
+ // Need to adjust resume offset for user specified range
+
+ headers.removeOne("Range");
+
+ // We've already verified that requestRange starts with "bytes=", see canResume.
+ QByteArray requestRange = request().rawHeader("Range").mid(6);
+
+ int index = requestRange.indexOf('-');
+
+ quint64 requestStartOffset = requestRange.left(index).toULongLong();
+ quint64 requestEndOffset = requestRange.mid(index + 1).toULongLong();
+
+ requestRange = "bytes=" + QByteArray::number(resumeOffset + requestStartOffset) +
+ '-' + QByteArray::number(requestEndOffset);
+
+ httpRequest.setHeaderField("Range", requestRange);
+ } else {
+ httpRequest.setHeaderField("Range", "bytes=" + QByteArray::number(resumeOffset) + '-');
+ }
+ }
foreach (const QByteArray &header, headers)
httpRequest.setHeaderField(header, request().rawHeader(header));
@@ -1117,6 +1140,31 @@ QNetworkCacheMetaData QNetworkAccessHttpBackend::fetchCacheMetaData(const QNetwo
return metaData;
}
+bool QNetworkAccessHttpBackend::canResume() const
+{
+ // Only GET operation supports resuming.
+ if (operation() != QNetworkAccessManager::GetOperation)
+ return false;
+
+ // Can only resume if server/resource supports Range header.
+ if (httpReply->headerField("Accept-Ranges", "none") == "none")
+ return false;
+
+ // We only support resuming for byte ranges.
+ if (request().hasRawHeader("Range")) {
+ QByteArray range = request().rawHeader("Range");
+ if (!range.startsWith("bytes="))
+ return false;
+ }
+
+ return true;
+}
+
+void QNetworkAccessHttpBackend::setResumeOffset(quint64 offset)
+{
+ resumeOffset = offset;
+}
+
QT_END_NAMESPACE
#endif // QT_NO_HTTP