diff --git a/src/common/NetworkPrivate.cpp b/src/common/NetworkPrivate.cpp index ae81277e..9d0b99f3 100644 --- a/src/common/NetworkPrivate.cpp +++ b/src/common/NetworkPrivate.cpp @@ -17,6 +17,7 @@ namespace chatterino { NetworkData::NetworkData() : timer_(new QTimer()) + , lifetimeManager_(new QObject) { timer_->setSingleShot(true); @@ -26,6 +27,7 @@ NetworkData::NetworkData() NetworkData::~NetworkData() { this->timer_->deleteLater(); + this->lifetimeManager_->deleteLater(); DebugCount::decrease("NetworkData"); } @@ -104,8 +106,18 @@ void loadUncached(const std::shared_ptr &data) data->request_); case NetworkRequestType::Post: - return NetworkManager::accessManager.post(data->request_, - data->payload_); + if (data->multiPartPayload_) + { + assert(data->payload_.isNull()); + + return NetworkManager::accessManager.post( + data->request_, data->multiPartPayload_); + } + else + { + return NetworkManager::accessManager.post( + data->request_, data->payload_); + } } return nullptr; }(); diff --git a/src/common/NetworkPrivate.hpp b/src/common/NetworkPrivate.hpp index be08a7ea..1009c556 100644 --- a/src/common/NetworkPrivate.hpp +++ b/src/common/NetworkPrivate.hpp @@ -3,6 +3,7 @@ #include "common/NetworkCommon.hpp" #include "util/QObjectRef.hpp" +#include #include #include @@ -45,6 +46,8 @@ struct NetworkData { NetworkRequestType requestType_ = NetworkRequestType::Get; QByteArray payload_; + // lifetime secured by lifetimeManager_ + QHttpMultiPart *multiPartPayload_{}; // Timer that tracks the timeout // By default, there's no explicit timeout for the request @@ -52,6 +55,7 @@ struct NetworkData { // execute is called bool hasTimeout_{}; QTimer *timer_; + QObject *lifetimeManager_; QString getHash(); diff --git a/src/common/NetworkRequest.cpp b/src/common/NetworkRequest.cpp index b0475bd6..f0019bcb 100644 --- a/src/common/NetworkRequest.cpp +++ b/src/common/NetworkRequest.cpp @@ -127,6 +127,13 @@ NetworkRequest NetworkRequest::authorizeTwitchV5(const QString &clientID, return tmp; } +NetworkRequest NetworkRequest::multiPart(QHttpMultiPart *payload) && +{ + payload->setParent(this->data->lifetimeManager_); + this->data->multiPartPayload_ = payload; + return std::move(*this); +} + NetworkRequest NetworkRequest::payload(const QByteArray &payload) && { this->data->payload_ = payload; diff --git a/src/common/NetworkRequest.hpp b/src/common/NetworkRequest.hpp index 501138f0..3e806c3e 100644 --- a/src/common/NetworkRequest.hpp +++ b/src/common/NetworkRequest.hpp @@ -56,6 +56,7 @@ public: NetworkRequest concurrent() &&; NetworkRequest authorizeTwitchV5(const QString &clientID, const QString &oauthToken = QString()) &&; + NetworkRequest multiPart(QHttpMultiPart *payload) &&; void execute();