File indexing completed on 2024-05-12 03:56:46

0001 /*
0002     SPDX-FileCopyrightText: 2000-2003 Waldo Bastian <bastian@kde.org>
0003     SPDX-FileCopyrightText: 2000-2002 George Staikos <staikos@kde.org>
0004     SPDX-FileCopyrightText: 2000-2002 Dawit Alemayehu <adawit@kde.org>
0005     SPDX-FileCopyrightText: 2001, 2002 Hamish Rodda <rodda@kde.org>
0006     SPDX-FileCopyrightText: 2007 Nick Shaforostoff <shafff@ukr.net>
0007     SPDX-FileCopyrightText: 2007-2018 Daniel Nicoletti <dantti12@gmail.com>
0008     SPDX-FileCopyrightText: 2008, 2009 Andreas Hartmetz <ahartmetz@gmail.com>
0009     SPDX-FileCopyrightText: 2022 Harald Sitter <sitter@kde.org>
0010     SPDX-FileCopyrightText: 2023 Nicolas Fella <nicolas.fella@gmx.de>
0011 
0012     SPDX-License-Identifier: LGPL-2.0-or-later
0013 */
0014 
0015 #ifndef HTTP_H
0016 #define HTTP_H
0017 
0018 #include <KIO/WorkerBase>
0019 
0020 #include <QNetworkReply>
0021 #include <QSslError>
0022 
0023 #include "httpmethod_p.h"
0024 
0025 class QDomNodeList;
0026 
0027 class HTTPProtocol : public QObject, public KIO::WorkerBase
0028 {
0029     Q_OBJECT
0030 public:
0031     HTTPProtocol(const QByteArray &protocol, const QByteArray &pool, const QByteArray &app);
0032     ~HTTPProtocol() override;
0033 
0034     KIO::WorkerResult get(const QUrl &url) override;
0035     KIO::WorkerResult put(const QUrl &url, int _mode, KIO::JobFlags flags) override;
0036     KIO::WorkerResult mimetype(const QUrl &url) override;
0037     KIO::WorkerResult special(const QByteArray &data) override;
0038     KIO::WorkerResult stat(const QUrl &url) override;
0039     KIO::WorkerResult listDir(const QUrl &url) override;
0040     KIO::WorkerResult mkdir(const QUrl &url, int _permissions) override;
0041     KIO::WorkerResult rename(const QUrl &src, const QUrl &dest, KIO::JobFlags flags) override;
0042     KIO::WorkerResult copy(const QUrl &src, const QUrl &dest, int, KIO::JobFlags flags) override;
0043     KIO::WorkerResult del(const QUrl &url, bool _isfile) override;
0044     KIO::WorkerResult fileSystemFreeSpace(const QUrl &url) override;
0045 
0046 Q_SIGNALS:
0047     void errorOut(KIO::Error error);
0048 
0049 private:
0050     enum DataMode {
0051         // emit data() as it is received
0052         Emit,
0053         // turn the data in the response
0054         Return,
0055         // discard any response data
0056         Discard,
0057     };
0058 
0059     struct Response {
0060         int httpCode;
0061         QByteArray data;
0062         int kioCode = 0;
0063     };
0064 
0065     /**
0066      * Handles file -> webdav put requests.
0067      */
0068     [[nodiscard]] KIO::WorkerResult copyPut(const QUrl &src, const QUrl &dest, KIO::JobFlags flags);
0069 
0070     void handleSslErrors(QNetworkReply *reply, const QList<QSslError> errors);
0071     void handleRedirection(KIO::HTTP_METHOD method, const QUrl &originalUrl, QNetworkReply *reply);
0072 
0073     [[nodiscard]] KIO::WorkerResult davStatList(const QUrl &url, bool stat);
0074     void davParsePropstats(const QDomNodeList &propstats, KIO::UDSEntry &entry);
0075     QDateTime parseDateTime(const QString &input, const QString &type);
0076     void davParseActiveLocks(const QDomNodeList &activeLocks, uint &lockCount);
0077     int codeFromResponse(const QString &response);
0078     bool davDestinationExists(const QUrl &url);
0079     QByteArray getData();
0080     QString getContentType();
0081 
0082     void setSslMetaData();
0083 
0084     [[nodiscard]] KIO::WorkerResult post(const QUrl &url, qint64 size);
0085     [[nodiscard]] Response
0086     makeRequest(const QUrl &url, KIO::HTTP_METHOD method, QIODevice *inputData, DataMode dataMode, const QMap<QByteArray, QByteArray> &extraHeaders = {});
0087 
0088     [[nodiscard]] Response
0089     makeDavRequest(const QUrl &url, KIO::HTTP_METHOD, QByteArray &inputData, DataMode dataMode, const QMap<QByteArray, QByteArray> &extraHeaders = {});
0090     [[nodiscard]] Response
0091     makeRequest(const QUrl &url, KIO::HTTP_METHOD, QByteArray &inputData, DataMode dataMode, const QMap<QByteArray, QByteArray> &extraHeaders = {});
0092 
0093     [[nodiscard]] KIO::WorkerResult davError(KIO::HTTP_METHOD method, const QUrl &url, const Response &response);
0094     [[nodiscard]] KIO::WorkerResult davError(QString &errorMsg, KIO::HTTP_METHOD method, int code, const QUrl &_url, const QByteArray &responseData);
0095     [[nodiscard]] KIO::WorkerResult sendHttpError(const QUrl &url, KIO::HTTP_METHOD method, const Response &response);
0096     [[nodiscard]] KIO::WorkerResult davGeneric(const QUrl &url, KIO::HTTP_METHOD method, qint64 size = -1);
0097     QString davProcessLocks();
0098     static QByteArray methodToString(KIO::HTTP_METHOD method);
0099 
0100     KIO::MetaData sslMetaData;
0101     KIO::Error lastError = (KIO::Error)KJob::NoError;
0102     QString m_hostName;
0103 };
0104 
0105 #endif