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"