File indexing completed on 2025-02-16 03:42:24
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