3 #include "networkhttpreply.h"
7 QNetworkAccessManager *networkAccessManager() {
8 static thread_local QNetworkAccessManager *nam = new QNetworkAccessManager();
12 int defaultReadTimeout = 10000;
13 int defaultMaxRetries = 3;
17 : requestHeaders(getDefaultRequestHeaders()), readTimeout(defaultReadTimeout),
18 maxRetries(defaultMaxRetries) {}
20 void Http::setRequestHeaders(const QMap<QByteArray, QByteArray> &headers) {
21 requestHeaders = headers;
24 QMap<QByteArray, QByteArray> &Http::getRequestHeaders() {
25 return requestHeaders;
28 void Http::addRequestHeader(const QByteArray &name, const QByteArray &value) {
29 requestHeaders.insert(name, value);
32 void Http::setReadTimeout(int timeout) {
33 readTimeout = timeout;
36 Http &Http::instance() {
41 const QMap<QByteArray, QByteArray> &Http::getDefaultRequestHeaders() {
42 static const QMap<QByteArray, QByteArray> defaultRequestHeaders = [] {
43 QMap<QByteArray, QByteArray> h;
44 h.insert("Accept-Charset", "utf-8");
45 h.insert("Connection", "Keep-Alive");
48 return defaultRequestHeaders;
51 void Http::setDefaultReadTimeout(int timeout) {
52 defaultReadTimeout = timeout;
55 QNetworkReply *Http::networkReply(const HttpRequest &req) {
56 QNetworkRequest request(req.url);
58 QMap<QByteArray, QByteArray> &headers = requestHeaders;
59 if (!req.headers.isEmpty()) headers = req.headers;
61 QMap<QByteArray, QByteArray>::const_iterator it;
62 for (it = headers.constBegin(); it != headers.constEnd(); ++it)
63 request.setRawHeader(it.key(), it.value());
66 request.setRawHeader("Range", QStringLiteral("bytes=%1-").arg(req.offset).toUtf8());
68 QNetworkAccessManager *manager = networkAccessManager();
70 QNetworkReply *networkReply = nullptr;
71 switch (req.operation) {
72 case QNetworkAccessManager::GetOperation:
73 networkReply = manager->get(request);
76 case QNetworkAccessManager::HeadOperation:
77 networkReply = manager->head(request);
80 case QNetworkAccessManager::PostOperation:
81 networkReply = manager->post(request, req.body);
85 qWarning() << "Unknown operation:" << req.operation;
91 HttpReply *Http::request(const HttpRequest &req) {
92 return new NetworkHttpReply(req, *this);
95 HttpReply *Http::request(const QUrl &url,
96 QNetworkAccessManager::Operation operation,
97 const QByteArray &body,
101 req.operation = operation;
107 HttpReply *Http::get(const QUrl &url) {
108 return request(url, QNetworkAccessManager::GetOperation);
111 HttpReply *Http::head(const QUrl &url) {
112 return request(url, QNetworkAccessManager::HeadOperation);
115 HttpReply *Http::post(const QUrl &url, const QMap<QString, QString> ¶ms) {
117 QMapIterator<QString, QString> i(params);
118 while (i.hasNext()) {
120 body += QUrl::toPercentEncoding(i.key()) + '=' + QUrl::toPercentEncoding(i.value()) + '&';
124 req.operation = QNetworkAccessManager::PostOperation;
126 req.headers = requestHeaders;
127 req.headers.insert("Content-Type", "application/x-www-form-urlencoded");
131 HttpReply *Http::post(const QUrl &url, const QByteArray &body, const QByteArray &contentType) {
134 req.operation = QNetworkAccessManager::PostOperation;
136 req.headers = requestHeaders;
137 QByteArray cType = contentType;
138 if (cType.isEmpty()) cType = "application/x-www-form-urlencoded";
139 req.headers.insert("Content-Type", cType);
143 int Http::getMaxRetries() const
148 void Http::setMaxRetries(int value)