-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathNetworkRequestMaker.cpp
87 lines (79 loc) · 4 KB
/
NetworkRequestMaker.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include "NetworkRequestMaker.h"
QString NetworkRequestMaker::BASE_URL = "https://feelinsonice-hrd.appspot.com/";
const QString NetworkRequestMaker::HEADER_USER_AGENT = "Snapchat/8.1.0.8 Beta (A0001; Android 21; gzip)";
const QString NetworkRequestMaker::HEADER_URL_ENCODED = "application/x-www-form-urlencoded";
NetworkRequestMaker::NetworkRequestMaker(){
//Initialize variables
this->manager = new QNetworkAccessManager(this);
//Connect signals
connect(this->manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(finished(QNetworkReply*)));
}
NetworkRequestMaker::~NetworkRequestMaker(){
delete this->manager;
}
void NetworkRequestMaker::executeRequest(int id, const QString &url, const QUrlQuery ¶ms, std::function<void(int, int, QByteArray)> callback_function){
//Create request
QNetworkRequest request = QNetworkRequest(QUrl(BASE_URL + url));
//Setup headers
request.setSslConfiguration(QSslConfiguration::defaultConfiguration());
request.setHeader(QNetworkRequest::UserAgentHeader, HEADER_USER_AGENT);
request.setHeader(QNetworkRequest::ContentTypeHeader, HEADER_URL_ENCODED);
//Add parameters to byte array
QByteArray parameters;
parameters.append(params.toString());
//Execute POST request
QNetworkReply *reply = this->manager->post(request, parameters);
//Ignore certificates error in case of proxy
reply->ignoreSslErrors();
//Add to callback list
this->callback_list.insert(reply, RequestCallbackInfo(id, callback_function));
}
void NetworkRequestMaker::executeRequest(int id, const QString &url, const QList<QHttpPart> ¶ms, std::function<void(int, int, QByteArray)> callback_function){
//Create request
QNetworkRequest request = QNetworkRequest(QUrl(BASE_URL + url));
//Add parameters to QHttpMultiPart
QHttpMultiPart *parameters = new QHttpMultiPart(this->manager);
for(int i = 0; i < params.size(); i++){
parameters->append(params.at(i));
}
//Setup headers
request.setSslConfiguration(QSslConfiguration::defaultConfiguration());
request.setHeader(QNetworkRequest::UserAgentHeader, HEADER_USER_AGENT);
request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data; boundary=" + parameters->boundary());
//Execute POST request
QNetworkReply *reply = this->manager->post(request, parameters);
//Ignore certificates error in case of proxy
reply->ignoreSslErrors();
//Add to callback list
this->callback_list.insert(reply, RequestCallbackInfo(id, callback_function));
}
void NetworkRequestMaker::executeRequest(int id, const QString &url, const QHash<QString, QString> ¶ms, std::function<void(int, int, QByteArray)> callback_function){
QString urlWithParameters = url;
//Add parameters to URL
for(int i = 0; i < params.size(); i++){
urlWithParameters += (i == 0 ? "?" : "&") + params.keys().at(i) + "=" + params.values().at(i);
}
//Create request
QNetworkRequest request = QNetworkRequest(QUrl(BASE_URL + urlWithParameters));
//Setup headers
request.setSslConfiguration(QSslConfiguration::defaultConfiguration());
request.setHeader(QNetworkRequest::UserAgentHeader, HEADER_USER_AGENT);
//Execute GET request
QNetworkReply *reply = this->manager->get(request);
//Ignore certificates error in case of proxy
reply->ignoreSslErrors();
//Add to callback list
this->callback_list.insert(reply, RequestCallbackInfo(id, callback_function));
}
void NetworkRequestMaker::finished(QNetworkReply *reply){
//Read output data
QByteArray dataRead = reply->readAll();
//Log request history
Utils::log("Request to " + reply->url().toString() + " Result : " + dataRead);
//Get request callback info
RequestCallbackInfo reqCallInfo = this->callback_list.take(reply);
//Get the callback function
std::function<void(int, int, QByteArray)> callbackFunction = reqCallInfo.callback_func;
//Call it
callbackFunction(reqCallInfo.id, QVariant(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute)).toInt(), dataRead);
}