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