1
1
#include " httpclient.hpp"
2
2
3
3
#include < QEventLoop>
4
- #include < QFile>
4
+ #include < QFileInfo>
5
+ #include < QHttpMultiPart>
5
6
#include < QJsonDocument>
6
7
#include < QJsonObject>
7
8
#include < QPointer>
@@ -147,6 +148,13 @@ QJsonObject HttpClient::sync(QNetworkReply *reply)
147
148
return json;
148
149
}
149
150
151
+ void HttpClient::cancel (QNetworkReply *reply)
152
+ {
153
+ d_ptr->clearTask (reply);
154
+ reply->abort ();
155
+ reply->deleteLater ();
156
+ }
157
+
150
158
QNetworkReply *HttpClient::downLoad (const QUrl &url,
151
159
const QString &filePath,
152
160
int timeout,
@@ -168,7 +176,7 @@ QNetworkReply *HttpClient::downLoad(const QUrl &url,
168
176
const QByteArray fromRange = " bytes=" + QByteArray::number (bytes) + " -" ;
169
177
request.setRawHeader (" Range" , fromRange);
170
178
}
171
- qDebug () << QString (" Download: %-1 >%2" ).arg (url.toString (QUrl::RemoveUserInfo), filePath);
179
+ qDebug () << QString (" Download: %1- >%2" ).arg (url.toString (QUrl::RemoveUserInfo), filePath);
172
180
173
181
auto *reply = QNetworkAccessManager::get (request);
174
182
d_ptr->downloads
@@ -187,16 +195,17 @@ QNetworkReply *HttpClient::downLoad(const QUrl &url,
187
195
return reply;
188
196
}
189
197
190
- QNetworkReply *HttpClient::upload (const QUrl &url,
191
- const QString &filePath,
192
- int timeout,
193
- bool verifyCertificate,
194
- CallBack callBack)
198
+ QNetworkReply *HttpClient::upload_put (const QUrl &url,
199
+ const QString &filePath,
200
+ int timeout,
201
+ bool verifyCertificate,
202
+ CallBack callBack)
195
203
{
196
204
Q_ASSERT (!filePath.isEmpty ());
197
205
auto *file = new QFile (filePath, this );
198
206
if (!file->open (QIODevice::ReadOnly)) {
199
207
qWarning () << QString (" Cannot open the file: %1!" ).arg (filePath) << file->errorString ();
208
+ file->deleteLater ();
200
209
return nullptr ;
201
210
}
202
211
qDebug () << QString (" Upload: %1->%2" ).arg (filePath, url.toString (QUrl::RemoveUserInfo));
@@ -206,35 +215,78 @@ QNetworkReply *HttpClient::upload(const QUrl &url,
206
215
auto *reply = QNetworkAccessManager::put (request, file);
207
216
file->setParent (reply);
208
217
d_ptr->uploads .insert (reply, file);
209
- d_ptr->tasks .insert (reply, callBack);
210
- connect (reply, &QNetworkReply::errorOccurred, this , &HttpClient::onErrorOccurred);
211
- connect (reply, &QNetworkReply::sslErrors, this , &HttpClient::onSslErrors);
212
- connect (reply, &QNetworkReply::finished, this , &HttpClient::onUploadFinish);
213
- if (timeout > 0 ) {
214
- auto *timer = new QTimer (reply);
215
- connect (timer, &QTimer::timeout, this , &HttpClient::onNetworkTimeout);
216
- timer->start (timeout * 1000 );
217
- }
218
+ connectUploadSlots (reply, timeout, callBack);
218
219
return reply;
219
220
}
220
221
221
- QNetworkReply *HttpClient::upload (
222
+ QNetworkReply *HttpClient::upload_put (
222
223
const QUrl &url, const QByteArray &data, int timeout, bool verifyCertificate, CallBack callBack)
223
224
{
224
225
qDebug () << QString (" Upload To %1" ).arg (url.toString (QUrl::RemoveUserInfo));
225
226
226
227
auto request = d_ptr->networkRequest (verifyCertificate);
227
228
request.setUrl (url);
228
229
auto *reply = QNetworkAccessManager::put (request, data);
229
- d_ptr->tasks .insert (reply, callBack);
230
- connect (reply, &QNetworkReply::errorOccurred, this , &HttpClient::onErrorOccurred);
231
- connect (reply, &QNetworkReply::sslErrors, this , &HttpClient::onSslErrors);
232
- connect (reply, &QNetworkReply::finished, this , &HttpClient::onUploadFinish);
233
- if (timeout > 0 ) {
234
- auto *timer = new QTimer (reply);
235
- connect (timer, &QTimer::timeout, this , &HttpClient::onNetworkTimeout);
236
- timer->start (timeout * 1000 );
230
+ connectUploadSlots (reply, timeout, callBack);
231
+ return reply;
232
+ }
233
+
234
+ QNetworkReply *HttpClient::upload_post (const QUrl &url,
235
+ const QString &filePath,
236
+ int timeout,
237
+ bool verifyCertificate,
238
+ CallBack callBack)
239
+ {
240
+ Q_ASSERT (!filePath.isEmpty ());
241
+ auto *file = new QFile (filePath, this );
242
+ if (!file->open (QIODevice::ReadOnly)) {
243
+ qWarning () << QString (" Cannot open the file: %1!" ).arg (filePath) << file->errorString ();
244
+ file->deleteLater ();
245
+ return nullptr ;
237
246
}
247
+ auto filename = QFileInfo (filePath).fileName ();
248
+ qDebug () << QString (" Upload: %1->%2" )
249
+ .arg (filePath, url.toString (QUrl::RemoveUserInfo) + " /" + filename);
250
+
251
+ auto disposition = QString (" form-data; name=\" %1\" ; filename=\" %2\" " ).arg (" file" , filename);
252
+ QHttpPart filePart;
253
+ filePart.setHeader (QNetworkRequest::ContentDispositionHeader, QVariant (disposition));
254
+ filePart.setBodyDevice (file);
255
+ auto *multiPart = new QHttpMultiPart (QHttpMultiPart::FormDataType);
256
+ multiPart->append (filePart);
257
+
258
+ auto request = d_ptr->networkRequest (verifyCertificate);
259
+ request.setUrl (url);
260
+
261
+ auto *reply = QNetworkAccessManager::post (request, multiPart);
262
+ file->setParent (reply);
263
+ multiPart->setParent (reply);
264
+ d_ptr->uploads .insert (reply, file);
265
+ connectUploadSlots (reply, timeout, callBack);
266
+ return reply;
267
+ }
268
+
269
+ QNetworkReply *HttpClient::upload_post (const QUrl &url,
270
+ const QString &filename,
271
+ const QByteArray &data,
272
+ int timeout,
273
+ bool verifyCertificate,
274
+ CallBack callBack)
275
+ {
276
+ qDebug () << QString (" Upload To %1" ).arg (url.toString (QUrl::RemoveUserInfo) + " /" + filename);
277
+ auto disposition = QString (" form-data; name=\" %1\" ; filename=\" %2\" " ).arg (" file" , filename);
278
+ QHttpPart filePart;
279
+ filePart.setHeader (QNetworkRequest::ContentDispositionHeader, QVariant (disposition));
280
+ filePart.setBody (data);
281
+ auto *multiPart = new QHttpMultiPart (QHttpMultiPart::FormDataType);
282
+ multiPart->append (filePart);
283
+
284
+ auto request = d_ptr->networkRequest (verifyCertificate);
285
+ request.setUrl (url);
286
+
287
+ auto *reply = QNetworkAccessManager::post (request, multiPart);
288
+ multiPart->setParent (reply);
289
+ connectUploadSlots (reply, timeout, callBack);
238
290
return reply;
239
291
}
240
292
@@ -368,6 +420,19 @@ QJsonObject HttpClient::hookResult(const QJsonObject &object)
368
420
return object;
369
421
}
370
422
423
+ void HttpClient::connectUploadSlots (QNetworkReply *reply, int timeout, CallBack callBack)
424
+ {
425
+ d_ptr->tasks .insert (reply, callBack);
426
+ connect (reply, &QNetworkReply::errorOccurred, this , &HttpClient::onErrorOccurred);
427
+ connect (reply, &QNetworkReply::sslErrors, this , &HttpClient::onSslErrors);
428
+ connect (reply, &QNetworkReply::finished, this , &HttpClient::onUploadFinish);
429
+ if (timeout > 0 ) {
430
+ auto *timer = new QTimer (reply);
431
+ connect (timer, &QTimer::timeout, this , &HttpClient::onNetworkTimeout);
432
+ timer->start (timeout * 1000 );
433
+ }
434
+ }
435
+
371
436
void HttpClient::queryResult (QNetworkReply *reply, const QJsonObject &object)
372
437
{
373
438
qDebug () << object;
0 commit comments