diff options
author | Markus Goetz <markus@woboq.com> | 2013-11-25 22:00:34 +0400 |
---|---|---|
committer | Markus Goetz <markus@woboq.com> | 2013-11-25 22:01:04 +0400 |
commit | ac8296fb942ff30943aed5b4126033b33be85335 (patch) | |
tree | cd406fd6bb25a81edb3f1752eeba9b2280a14c01 /src/mirall | |
parent | f47ce2fea67fd9e3702634ee588fcef1137d042e (diff) |
Propagator: Check E-Tag when resuming
Should fix #756
Diffstat (limited to 'src/mirall')
-rw-r--r-- | src/mirall/owncloudpropagator.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/src/mirall/owncloudpropagator.cpp b/src/mirall/owncloudpropagator.cpp index b527948cf..f148fa982 100644 --- a/src/mirall/owncloudpropagator.cpp +++ b/src/mirall/owncloudpropagator.cpp @@ -519,6 +519,7 @@ private: QIODevice *_file; QScopedPointer<ne_decompress, ScopedPointerHelpers> _decompress; QString errorString; + QByteArray _expectedEtagForResume; static int content_reader(void *userdata, const char *buf, size_t len) { @@ -574,17 +575,28 @@ private: return; } - const char *etag = ne_get_response_header( req, "ETag" ); - if (!etag) { - qDebug() << Q_FUNC_INFO << "No E-Tag reply by server, considering it invalid"; + QByteArray etag = parseEtag(req); + if (etag.isEmpty()) { + qDebug() << Q_FUNC_INFO << "No E-Tag reply by server, considering it invalid" << ne_get_response_header(req, "etag"); that->errorString = QLatin1String("No E-Tag received from server, check Proxy/Gateway"); ne_set_error(that->_propagator->_session, "No E-Tag received from server, check Proxy/Gateway"); ne_add_response_body_reader( req, do_not_accept, do_not_download_content_reader, (void*) that ); return; + } else if (!that->_expectedEtagForResume.isEmpty() && that->_expectedEtagForResume != etag) { + qDebug() << Q_FUNC_INFO << "We received a different E-Tag for resuming!" + << QString::fromLatin1(that->_expectedEtagForResume.data()) << "vs" + << QString::fromLatin1(etag.data()); + that->errorString = QLatin1String("We received a different E-Tag for resuming. Retrying next time."); + ne_set_error(that->_propagator->_session, "We received a different E-Tag for resuming. Retrying next time."); + ne_add_response_body_reader( req, do_not_accept, + do_not_download_content_reader, + (void*) that ); + return; } + const char *enc = ne_get_response_header( req, "Content-Encoding" ); qDebug("Content encoding ist <%s> with status %d", enc ? enc : "empty", status ? status->code : -1 ); @@ -624,6 +636,7 @@ void PropagateDownloadFile::start() _propagator->_journal->setDownloadInfo(_item._file, SyncJournalDb::DownloadInfo()); } else { tmpFileName = progressInfo._tmpfile; + _expectedEtagForResume = progressInfo._etag; } } |