]> git.sur5r.net Git - minitube/blob - lib/http/src/http.h
New upstream version 3.1
[minitube] / lib / http / src / http.h
1 #ifndef HTTP_H
2 #define HTTP_H
3
4 #include <QtNetwork>
5
6 class HttpRequest {
7 public:
8     HttpRequest() : operation(QNetworkAccessManager::GetOperation), offset(0) {}
9     QUrl url;
10     QNetworkAccessManager::Operation operation;
11     QByteArray body;
12     uint offset;
13     QMap<QByteArray, QByteArray> headers;
14 };
15
16 class HttpReply : public QObject {
17     Q_OBJECT
18
19 public:
20     HttpReply(QObject *parent = nullptr) : QObject(parent) {}
21     virtual QUrl url() const = 0;
22     virtual int statusCode() const = 0;
23     int isSuccessful() const { return statusCode() >= 200 && statusCode() < 300; }
24     virtual QString reasonPhrase() const { return QString(); }
25     virtual const QList<QNetworkReply::RawHeaderPair> headers() const {
26         return QList<QNetworkReply::RawHeaderPair>();
27     }
28     virtual QByteArray header(const QByteArray &headerName) const {
29         Q_UNUSED(headerName);
30         return QByteArray();
31     }
32
33     virtual QByteArray body() const = 0;
34
35 signals:
36     void data(const QByteArray &bytes);
37     void error(const QString &message);
38     void finished(const HttpReply &reply);
39 };
40
41 class Http {
42 public:
43     static Http &instance();
44     static const QMap<QByteArray, QByteArray> &getDefaultRequestHeaders();
45     static void setDefaultReadTimeout(int timeout);
46
47     Http();
48
49     void setRequestHeaders(const QMap<QByteArray, QByteArray> &headers);
50     QMap<QByteArray, QByteArray> &getRequestHeaders();
51     void addRequestHeader(const QByteArray &name, const QByteArray &value);
52
53     void setReadTimeout(int timeout);
54     int getReadTimeout() { return readTimeout; }
55
56     QNetworkReply *networkReply(const HttpRequest &req);
57     virtual HttpReply *request(const HttpRequest &req);
58     HttpReply *
59     request(const QUrl &url,
60             QNetworkAccessManager::Operation operation = QNetworkAccessManager::GetOperation,
61             const QByteArray &body = QByteArray(),
62             uint offset = 0);
63     HttpReply *get(const QUrl &url);
64     HttpReply *head(const QUrl &url);
65     HttpReply *post(const QUrl &url, const QMap<QString, QString> &params);
66     HttpReply *post(const QUrl &url, const QByteArray &body, const QByteArray &contentType);
67
68 private:
69     QMap<QByteArray, QByteArray> requestHeaders;
70     int readTimeout;
71 };
72
73 class NetworkHttpReply : public HttpReply {
74     Q_OBJECT
75
76 public:
77     NetworkHttpReply(const HttpRequest &req, Http &http);
78     QUrl url() const;
79     int statusCode() const;
80     QString reasonPhrase() const;
81     const QList<QNetworkReply::RawHeaderPair> headers() const;
82     QByteArray header(const QByteArray &headerName) const;
83     QByteArray body() const;
84
85 private slots:
86     void replyFinished();
87     void replyError(QNetworkReply::NetworkError);
88     void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
89     void readTimeout();
90
91 private:
92     void setupReply();
93     QString errorMessage();
94     void emitError();
95     void emitFinished();
96
97     Http &http;
98     HttpRequest req;
99     QNetworkReply *networkReply;
100     QTimer *readTimeoutTimer;
101     int retryCount;
102     QByteArray bytes;
103 };
104
105 #endif // HTTP_H