File indexing completed on 2024-04-21 03:53:52
0001 /* 0002 SPDX-FileCopyrightText: 2010 Tobias Koenig <tokoe@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "davitemfetchjob.h" 0008 #include "davjobbase_p.h" 0009 0010 #include "daverror.h" 0011 0012 #include <KIO/DavJob> 0013 #include <KIO/StoredTransferJob> 0014 0015 using namespace KDAV; 0016 namespace KDAV 0017 { 0018 class DavItemFetchJobPrivate : public DavJobBasePrivate 0019 { 0020 public: 0021 void davJobFinished(KJob *job); 0022 0023 DavUrl mUrl; 0024 DavItem mItem; 0025 }; 0026 } 0027 0028 static QString etagFromHeaders(const QString &headers) 0029 { 0030 const QStringList allHeaders = headers.split(QLatin1Char('\n')); 0031 0032 QString etag; 0033 for (const QString &header : allHeaders) { 0034 if (header.startsWith(QLatin1String("etag:"), Qt::CaseInsensitive)) { 0035 etag = header.section(QLatin1Char(' '), 1); 0036 } 0037 } 0038 0039 return etag; 0040 } 0041 0042 DavItemFetchJob::DavItemFetchJob(const DavItem &item, QObject *parent) 0043 : DavJobBase(new DavItemFetchJobPrivate, parent) 0044 { 0045 Q_D(DavItemFetchJob); 0046 d->mItem = item; 0047 } 0048 0049 void DavItemFetchJob::start() 0050 { 0051 Q_D(DavItemFetchJob); 0052 KIO::StoredTransferJob *job = KIO::storedGet(d->mItem.url().url(), KIO::Reload, KIO::HideProgressInfo | KIO::DefaultFlags); 0053 job->addMetaData(QStringLiteral("PropagateHttpHeader"), QStringLiteral("true")); 0054 // Work around a strange bug in Zimbra (seen at least on CE 5.0.18) : if the user-agent 0055 // contains "Mozilla", some strange debug data is displayed in the shared calendars. 0056 // This kinda mess up the events parsing... 0057 job->addMetaData(QStringLiteral("UserAgent"), QStringLiteral("KDE DAV groupware client")); 0058 job->addMetaData(QStringLiteral("cookies"), QStringLiteral("none")); 0059 job->addMetaData(QStringLiteral("no-auth-prompt"), QStringLiteral("true")); 0060 0061 connect(job, &KIO::StoredTransferJob::result, this, [d](KJob *job) { 0062 d->davJobFinished(job); 0063 }); 0064 } 0065 0066 DavItem DavItemFetchJob::item() const 0067 { 0068 Q_D(const DavItemFetchJob); 0069 return d->mItem; 0070 } 0071 0072 void DavItemFetchJobPrivate::davJobFinished(KJob *job) 0073 { 0074 KIO::StoredTransferJob *storedJob = qobject_cast<KIO::StoredTransferJob *>(job); 0075 const QString responseCodeStr = storedJob->queryMetaData(QStringLiteral("responsecode")); 0076 const int responseCode = responseCodeStr.isEmpty() ? 0 : responseCodeStr.toInt(); 0077 0078 setLatestResponseCode(responseCode); 0079 0080 if (storedJob->error()) { 0081 setLatestResponseCode(responseCode); 0082 setError(ERR_PROBLEM_WITH_REQUEST); 0083 setJobErrorText(storedJob->errorText()); 0084 setJobError(storedJob->error()); 0085 setErrorTextFromDavError(); 0086 } else { 0087 mItem.setData(storedJob->data()); 0088 mItem.setContentType(storedJob->queryMetaData(QStringLiteral("content-type"))); 0089 mItem.setEtag(etagFromHeaders(storedJob->queryMetaData(QStringLiteral("HTTP-Headers")))); 0090 } 0091 0092 emitResult(); 0093 } 0094 0095 #include "moc_davitemfetchjob.cpp"