3 #include "networkhttpreply.h"
7 QNetworkAccessManager *networkAccessManager() {
8 static thread_local QNetworkAccessManager *nam = [] {
9 auto nam = new QNetworkAccessManager();
10 #if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)
11 nam->setRedirectPolicy(QNetworkRequest::NoLessSafeRedirectPolicy);
18 int defaultReadTimeout = 10000;
19 int defaultMaxRetries = 3;
23 : requestHeaders(getDefaultRequestHeaders()), readTimeout(defaultReadTimeout),
24 maxRetries(defaultMaxRetries) {}
26 void Http::setRequestHeaders(const QMap<QByteArray, QByteArray> &headers) {
27 requestHeaders = headers;
30 QMap<QByteArray, QByteArray> &Http::getRequestHeaders() {
31 return requestHeaders;
34 void Http::addRequestHeader(const QByteArray &name, const QByteArray &value) {
35 requestHeaders.insert(name, value);
38 void Http::setReadTimeout(int timeout) {
39 readTimeout = timeout;
42 Http &Http::instance() {
47 const QMap<QByteArray, QByteArray> &Http::getDefaultRequestHeaders() {
48 static const QMap<QByteArray, QByteArray> defaultRequestHeaders = [] {
49 QMap<QByteArray, QByteArray> h;
50 h.insert("Accept-Charset", "utf-8");
51 h.insert("Connection", "Keep-Alive");
54 return defaultRequestHeaders;
57 void Http::setDefaultReadTimeout(int timeout) {
58 defaultReadTimeout = timeout;
61 QNetworkReply *Http::networkReply(const HttpRequest &req) {
62 QNetworkRequest request(req.url);
64 QMap<QByteArray, QByteArray> &headers = requestHeaders;
65 if (!req.headers.isEmpty()) headers = req.headers;
67 QMap<QByteArray, QByteArray>::const_iterator it;
68 for (it = headers.constBegin(); it != headers.constEnd(); ++it)
69 request.setRawHeader(it.key(), it.value());
72 request.setRawHeader("Range", QStringLiteral("bytes=%1-").arg(req.offset).toUtf8());
74 QNetworkAccessManager *manager = networkAccessManager();
76 QNetworkReply *networkReply = nullptr;
77 switch (req.operation) {
78 case QNetworkAccessManager::GetOperation:
79 networkReply = manager->get(request);
82 case QNetworkAccessManager::HeadOperation:
83 networkReply = manager->head(request);
86 case QNetworkAccessManager::PostOperation:
87 networkReply = manager->post(request, req.body);
90 case QNetworkAccessManager::PutOperation:
91 networkReply = manager->put(request, req.body);
94 case QNetworkAccessManager::DeleteOperation:
95 networkReply = manager->deleteResource(request);
99 qWarning() << "Unknown operation:" << req.operation;
105 HttpReply *Http::request(const HttpRequest &req) {
106 return new NetworkHttpReply(req, *this);
109 HttpReply *Http::request(const QUrl &url,
110 QNetworkAccessManager::Operation operation,
111 const QByteArray &body,
115 req.operation = operation;
121 HttpReply *Http::get(const QUrl &url) {
122 return request(url, QNetworkAccessManager::GetOperation);
125 HttpReply *Http::head(const QUrl &url) {
126 return request(url, QNetworkAccessManager::HeadOperation);
129 HttpReply *Http::post(const QUrl &url, const QMap<QString, QString> ¶ms) {
131 QMapIterator<QString, QString> i(params);
132 while (i.hasNext()) {
134 body += QUrl::toPercentEncoding(i.key()) + '=' + QUrl::toPercentEncoding(i.value()) + '&';
138 req.operation = QNetworkAccessManager::PostOperation;
140 req.headers = requestHeaders;
141 req.headers.insert("Content-Type", "application/x-www-form-urlencoded");
145 HttpReply *Http::post(const QUrl &url, const QByteArray &body, const QByteArray &contentType) {
148 req.operation = QNetworkAccessManager::PostOperation;
150 req.headers = requestHeaders;
151 QByteArray cType = contentType;
152 if (cType.isEmpty()) cType = "application/x-www-form-urlencoded";
153 req.headers.insert("Content-Type", cType);
158 HttpReply *Http::put(const QUrl &url, const QByteArray &body, const QByteArray &contentType) {
161 req.operation = QNetworkAccessManager::PutOperation;
163 req.headers = requestHeaders;
164 QByteArray cType = contentType;
165 if (cType.isEmpty()) cType = "application/x-www-form-urlencoded";
166 req.headers.insert("Content-Type", cType);
171 HttpReply *Http::deleteResource(const QUrl &url) {
174 req.operation = QNetworkAccessManager::DeleteOperation;
175 req.headers = requestHeaders;
179 int Http::getMaxRetries() const {
183 void Http::setMaxRetries(int value) {