auto onePartBody = onePart.mid(headerEndPosition + 4, onePart.size() - headerEndPosition - 6);
auto onePartHeaders = onePartHeaderPart.split(QStringLiteral("\r\n"));
QMap<QString, QString> allHeaders;
- for(auto oneHeader : onePartHeaders) {
+ for(const auto &oneHeader : onePartHeaders) {
auto headerParts = oneHeader.split(QStringLiteral(": "));
- allHeaders[headerParts.at(0)] = headerParts.at(1);
+ allHeaders[headerParts.at(0).toLower()] = headerParts.at(1);
}
- const auto fileName = allHeaders[QStringLiteral("X-File-Path")];
- const auto modtime = allHeaders[QByteArrayLiteral("X-File-Mtime")].toLongLong();
+ const auto fileName = allHeaders[QStringLiteral("x-file-path")];
+ const auto modtime = allHeaders[QByteArrayLiteral("x-file-mtime")].toLongLong();
Q_ASSERT(!fileName.isEmpty());
Q_ASSERT(modtime > 0);
FileInfo *fileInfo = remoteRootFileInfo.find(fileName);
// Assume that the file is filled with the same character
fileInfo = remoteRootFileInfo.create(fileName, onePartBody.size(), onePartBody.at(0).toLatin1());
}
- fileInfo->lastModified = OCC::Utility::qDateTimeFromTime_t(request.rawHeader("X-OC-Mtime").toLongLong());
+ fileInfo->lastModified = OCC::Utility::qDateTimeFromTime_t(request.rawHeader("x-oc-mtime").toLongLong());
remoteRootFileInfo.find(fileName, /*invalidateEtags=*/true);
result.push_back(fileInfo);
}
QMap<QString, QByteArray> allHeaders;
for(const auto &oneHeader : qAsConst(onePartHeaders)) {
auto headerParts = oneHeader.split(QStringLiteral(": "));
- allHeaders[headerParts.at(0)] = headerParts.at(1).toLatin1();
+ allHeaders[headerParts.at(0).toLower()] = headerParts.at(1).toLatin1();
}
auto reply = replyFunction(allHeaders);
if (reply.contains(QStringLiteral("error")) &&
reply.contains(QStringLiteral("etag"))) {
- fullReply.insert(allHeaders[QStringLiteral("X-File-Path")], reply);
+ fullReply.insert(allHeaders[QStringLiteral("x-file-path")], reply);
}
}
xml.writeEndElement(); // prop
xml.writeEndDocument();
}
+
+FakeJsonReply::FakeJsonReply(QNetworkAccessManager::Operation op,
+ const QNetworkRequest &request,
+ QObject *parent,
+ int httpReturnCode,
+ const QJsonDocument &reply)
+ : FakeReply{parent}
+ , _body{reply.toJson()}
+{
+ setRequest(request);
+ setUrl(request.url());
+ setOperation(op);
+ open(QIODevice::ReadOnly);
+ setAttribute(QNetworkRequest::HttpStatusCodeAttribute, httpReturnCode);
+ QMetaObject::invokeMethod(this, &FakeJsonReply::respond, Qt::QueuedConnection);
+}
+
+void FakeJsonReply::respond()
+{
+ emit metaDataChanged();
+ emit readyRead();
+ // finishing can come strictly after readyRead was called
+ QTimer::singleShot(5, this, &FakeJsonReply::slotSetFinished);
+}
+
+void FakeJsonReply::slotSetFinished()
+{
+ setFinished(true);
+ emit finished();
+}
+
+qint64 FakeJsonReply::readData(char *buf, qint64 max)
+{
+ max = qMin<qint64>(max, _body.size());
+ memcpy(buf, _body.constData(), max);
+ _body = _body.mid(max);
+ return max;
+}
+
+qint64 FakeJsonReply::bytesAvailable() const
+{
+ return _body.size();
+}
using QNetworkReply::setRawHeader;
};
+class FakeJsonReply : public FakeReply
+{
+ Q_OBJECT
+public:
+ FakeJsonReply(QNetworkAccessManager::Operation op,
+ const QNetworkRequest &request,
+ QObject *parent,
+ int httpReturnCode,
+ const QJsonDocument &reply = QJsonDocument());
+
+ Q_INVOKABLE virtual void respond();
+
+public slots:
+ void slotSetFinished();
+
+public:
+ void abort() override { }
+ qint64 readData(char *buf, qint64 max) override;
+ [[nodiscard]] qint64 bytesAvailable() const override;
+
+ QByteArray _body;
+};
+
class FakePropfindReply : public FakeReply
{
Q_OBJECT
if (op == QNetworkAccessManager::PostOperation) {
++nPOST;
if (contentType.startsWith(QStringLiteral("multipart/related; boundary="))) {
- auto jsonReplyObject = fakeFolder.forEachReplyPart(outgoingData, contentType, [] (const QMap<QString, QByteArray> &allHeaders) -> QJsonObject {
+ auto hasAnError = false;
+ auto jsonReplyObject = fakeFolder.forEachReplyPart(outgoingData, contentType, [&hasAnError] (const QMap<QString, QByteArray> &allHeaders) -> QJsonObject {
auto reply = QJsonObject{};
- const auto fileName = allHeaders[QStringLiteral("X-File-Path")];
+ const auto fileName = allHeaders[QStringLiteral("x-file-path")];
if (fileName.endsWith("A/big2") ||
fileName.endsWith("A/big3") ||
fileName.endsWith("A/big4") ||
fileName.endsWith("A/big5") ||
fileName.endsWith("A/big7") ||
fileName.endsWith("B/big8")) {
+ hasAnError = true;
reply.insert(QStringLiteral("error"), true);
reply.insert(QStringLiteral("etag"), {});
return reply;
if (jsonReplyObject.size()) {
auto jsonReply = QJsonDocument{};
jsonReply.setObject(jsonReplyObject);
- return new FakeJsonErrorReply{op, request, this, 200, jsonReply};
+ if (hasAnError) {
+ return new FakeJsonErrorReply{op, request, this, 200, jsonReply};
+ } else {
+ return new FakeJsonReply{op, request, this, 200, jsonReply};
+ }
}
return nullptr;
}