From 7e00ac4711ed48f7690e26772010e497d5691533 Mon Sep 17 00:00:00 2001 From: Yuriy Puchkov Date: Wed, 19 Aug 2020 16:04:06 +0300 Subject: [PATCH] Connection lost on network settings update --- src/tools/imgs3/imgs3uploader.cpp | 87 ++++++++++++++++++++++--------- src/tools/imgs3/imgs3uploader.h | 5 +- 2 files changed, 65 insertions(+), 27 deletions(-) diff --git a/src/tools/imgs3/imgs3uploader.cpp b/src/tools/imgs3/imgs3uploader.cpp index 4231d6e9..405b554a 100644 --- a/src/tools/imgs3/imgs3uploader.cpp +++ b/src/tools/imgs3/imgs3uploader.cpp @@ -60,11 +60,14 @@ ImgS3Uploader::ImgS3Uploader(QWidget *parent) : } void ImgS3Uploader::init(const QString &title, const QString &label) { - m_proxy = nullptr; - m_imageLabel = nullptr; m_spinner = nullptr; + m_proxy = nullptr; + m_NetworkAMUpload = nullptr; + m_NetworkAMGetCreds = nullptr; + m_NetworkAMRemove = nullptr; + m_success = false; setWindowTitle(title); setWindowIcon(QIcon(":img/app/flameshot.svg")); @@ -82,29 +85,24 @@ void ImgS3Uploader::init(const QString &title, const QString &label) { m_vLayout->addWidget(m_infoLabel); setAttribute(Qt::WA_DeleteOnClose); - - // get enterprise settings - m_configEnterprise = new ConfigEnterprise(); - - // get s3 credentials - initNetwork(); } -void ImgS3Uploader::initNetwork() { - // Init network - m_NetworkAMUpload = new QNetworkAccessManager(this); - connect(m_NetworkAMUpload, &QNetworkAccessManager::finished, this, &ImgS3Uploader::handleReplyUpload); +QNetworkProxy *ImgS3Uploader::proxy() { + if(m_proxy == nullptr) { + initProxy(); + } + return m_proxy; +} - m_NetworkAMGetCreds = new QNetworkAccessManager(this); - connect(m_NetworkAMGetCreds, &QNetworkAccessManager::finished, this, &ImgS3Uploader::handleReplyGetCreds); - - m_NetworkAMRemove = new QNetworkAccessManager(this); - connect(m_NetworkAMRemove, &QNetworkAccessManager::finished, this, &ImgS3Uploader::handleReplyDeleteResource); +QNetworkProxy *ImgS3Uploader::initProxy() { + // get enterprise settings + ConfigEnterprise *configEnterprise = new ConfigEnterprise(); // get proxy settings from "config.ini" file - QSettings *settings = m_configEnterprise->settings(); + QSettings *settings = configEnterprise->settings(); QString httpProxyHost = settings->value("HTTP_PROXY_HOST").toString(); - if(httpProxyHost.length() > 0 && m_proxy == nullptr) { + + if(httpProxyHost.length() > 0) { m_proxy = new QNetworkProxy(); if(settings->contains("HTTP_PROXY_TYPE")) { @@ -163,7 +161,7 @@ void ImgS3Uploader::initNetwork() { m_proxy->setPassword(proxies[0].password()); } } - +#ifdef QT_DEBUG if(m_proxy != nullptr) { qDebug() << "Using proxy server"; qDebug() << "proxy host:" << m_proxy->hostName(); @@ -171,15 +169,19 @@ void ImgS3Uploader::initNetwork() { qDebug() << "proxy type:" << m_proxy->type(); qDebug() << "proxy user:" << (m_proxy->user().length() > 0 ? m_proxy->user() : "no user"); qDebug() << "proxy password:" << (m_proxy->password().length() > 0 ? "***" : "no password"); - - QNetworkProxy::setApplicationProxy(*m_proxy); - m_NetworkAMUpload->setProxy(*m_proxy); - m_NetworkAMGetCreds->setProxy(*m_proxy); - m_NetworkAMRemove->setProxy(*m_proxy); } else { qDebug() << "No proxy"; } +#endif + return m_proxy; +} + +void ImgS3Uploader::clearProxy() { + if(m_proxy != nullptr) { + delete m_proxy; + m_proxy = nullptr; + } } @@ -301,10 +303,24 @@ void ImgS3Uploader::uploadToS3(QJsonDocument &response) { QUrl qUrl(url); QNetworkRequest request(qUrl); + + // upload m_NetworkAMUpload->post(request, multiPart); } void ImgS3Uploader::deleteResource(const QString &fileName, const QString &deleteToken) { + // read network settings on each call to simplify configuration management without restarting + clearProxy(); + if(m_NetworkAMRemove != nullptr) { + delete m_NetworkAMRemove; + m_NetworkAMRemove = nullptr; + } + m_NetworkAMRemove = new QNetworkAccessManager(this); + connect(m_NetworkAMRemove, &QNetworkAccessManager::finished, this, &ImgS3Uploader::handleReplyDeleteResource); + if(proxy() != nullptr) { + m_NetworkAMRemove->setProxy(*proxy()); + } + QNetworkRequest request; m_s3ImageName = fileName; m_deleteToken = deleteToken; @@ -318,6 +334,27 @@ void ImgS3Uploader::upload() { m_deleteToken.clear(); m_s3ImageName.clear(); + // read network settings on each call to simplify configuration management without restarting + // init creds and upload network access managers + clearProxy(); + if(m_NetworkAMGetCreds != nullptr) { + delete m_NetworkAMGetCreds; + m_NetworkAMGetCreds = nullptr; + } + m_NetworkAMGetCreds = new QNetworkAccessManager(this); + connect(m_NetworkAMGetCreds, &QNetworkAccessManager::finished, this, &ImgS3Uploader::handleReplyGetCreds); + + if(m_NetworkAMUpload != nullptr) { + delete m_NetworkAMUpload; + m_NetworkAMUpload = nullptr; + } + m_NetworkAMUpload = new QNetworkAccessManager(this); + connect(m_NetworkAMUpload, &QNetworkAccessManager::finished, this, &ImgS3Uploader::handleReplyUpload); + if(proxy() != nullptr) { + m_NetworkAMGetCreds->setProxy(*proxy()); + m_NetworkAMUpload->setProxy(*proxy()); + } + // get creads QUrl creds(m_s3Settings.credsUrl()); QNetworkRequest requestCreds(creds); diff --git a/src/tools/imgs3/imgs3uploader.h b/src/tools/imgs3/imgs3uploader.h index 9c90e207..1689a21d 100644 --- a/src/tools/imgs3/imgs3uploader.h +++ b/src/tools/imgs3/imgs3uploader.h @@ -59,18 +59,19 @@ private slots: private: void init(const QString &title, const QString &label); void uploadToS3(QJsonDocument &response); - void initNetwork(); + QNetworkProxy *initProxy(); + void clearProxy(); void onUploadOk(); void hideSpinner(); void setInfoLabelText(const QString &); + QNetworkProxy *proxy(); // class members private: bool m_success; - ConfigEnterprise *m_configEnterprise; ImgS3Settings m_s3Settings; ImageLabel *m_imageLabel;