proxy support for tt-rss

This commit is contained in:
Martin Rotter 2021-01-22 10:55:05 +01:00
parent bb361e5b9b
commit b5b412719f
13 changed files with 172 additions and 98 deletions

View file

@ -201,25 +201,6 @@ QNetworkReply::NetworkError NetworkFactory::downloadIcon(const QList<QString>& u
return network_result; return network_result;
} }
Downloader* NetworkFactory::performAsyncNetworkOperation(const QString& url, int timeout, const QByteArray& input_data,
QNetworkAccessManager::Operation operation,
QList<QPair<QByteArray, QByteArray>> additional_headers,
bool protected_contents, const QString& username,
const QString& password) {
auto* downloader = new Downloader();
QObject::connect(downloader, &Downloader::completed, downloader, &Downloader::deleteLater);
for (const auto& header : additional_headers) {
if (!header.first.isEmpty()) {
downloader->appendRawHeader(header.first, header.second);
}
}
downloader->manipulateData(url, operation, input_data, timeout, protected_contents, username, password);
return downloader;
}
NetworkResult NetworkFactory::performNetworkOperation(const QString& url, int timeout, const QByteArray& input_data, NetworkResult NetworkFactory::performNetworkOperation(const QString& url, int timeout, const QByteArray& input_data,
QByteArray& output, QNetworkAccessManager::Operation operation, QByteArray& output, QNetworkAccessManager::Operation operation,
QList<QPair<QByteArray, QByteArray>> additional_headers, QList<QPair<QByteArray, QByteArray>> additional_headers,

View file

@ -37,15 +37,6 @@ class NetworkFactory {
int timeout, int timeout,
QIcon& output, QIcon& output,
const QNetworkProxy& custom_proxy = QNetworkProxy::ProxyType::DefaultProxy); const QNetworkProxy& custom_proxy = QNetworkProxy::ProxyType::DefaultProxy);
static Downloader* performAsyncNetworkOperation(const QString& url,
int timeout,
const QByteArray& input_data,
QNetworkAccessManager::Operation operation,
QList<QPair<QByteArray,
QByteArray>> additional_headers = QList<QPair<QByteArray, QByteArray>>(),
bool protected_contents = false,
const QString& username = QString(),
const QString& password = QString());
static NetworkResult performNetworkOperation(const QString& url, int timeout, static NetworkResult performNetworkOperation(const QString& url, int timeout,
const QByteArray& input_data, const QByteArray& input_data,
QByteArray& output, QByteArray& output,

View file

@ -314,6 +314,8 @@ QNetworkProxy ServiceRoot::networkProxy() const {
void ServiceRoot::setNetworkProxy(const QNetworkProxy& network_proxy) { void ServiceRoot::setNetworkProxy(const QNetworkProxy& network_proxy) {
m_networkProxy = network_proxy; m_networkProxy = network_proxy;
emit proxyChanged(network_proxy);
} }
ImportantNode* ServiceRoot::importantNode() const { ImportantNode* ServiceRoot::importantNode() const {

View file

@ -153,10 +153,8 @@ class ServiceRoot : public RootItem {
// NOTE: Keep in sync with ServiceEntryRoot::code(). // NOTE: Keep in sync with ServiceEntryRoot::code().
virtual QString code() const = 0; virtual QString code() const = 0;
// These are not part of "interface".
CacheForServiceRoot* toCache() const;
public: public:
CacheForServiceRoot* toCache() const;
// Account ID corresponds with DB attribute Accounts (id). // Account ID corresponds with DB attribute Accounts (id).
int accountId() const; int accountId() const;
@ -231,6 +229,7 @@ class ServiceRoot : public RootItem {
void assembleFeeds(Assignment feeds); void assembleFeeds(Assignment feeds);
signals: signals:
void proxyChanged(QNetworkProxy proxy);
void dataChanged(QList<RootItem*> items); void dataChanged(QList<RootItem*> items);
void reloadMessageListRequested(bool mark_selected_messages_read); void reloadMessageListRequested(bool mark_selected_messages_read);
void itemExpandRequested(QList<RootItem*> items, bool expand); void itemExpandRequested(QList<RootItem*> items, bool expand);

View file

@ -13,6 +13,7 @@ FormEditTtRssAccount::FormEditTtRssAccount(QWidget* parent)
insertCustomTab(m_details, tr("Server setup"), 0); insertCustomTab(m_details, tr("Server setup"), 0);
activateTab(0); activateTab(0);
connect(m_details->m_ui.m_btnTestSetup, &QPushButton::clicked, this, &FormEditTtRssAccount::performTest);
m_details->m_ui.m_txtUrl->setFocus(); m_details->m_ui.m_txtUrl->setFocus();
} }
@ -32,7 +33,7 @@ void FormEditTtRssAccount::apply() {
accept(); accept();
if (editing_account) { if (editing_account) {
account<TtRssServiceRoot>()->network()->logout(); account<TtRssServiceRoot>()->network()->logout(m_account->networkProxy());
account<TtRssServiceRoot>()->completelyRemoveAllData(); account<TtRssServiceRoot>()->completelyRemoveAllData();
account<TtRssServiceRoot>()->syncIn(); account<TtRssServiceRoot>()->syncIn();
} }
@ -52,3 +53,7 @@ void FormEditTtRssAccount::setEditableAccount(ServiceRoot* editable_account) {
m_details->m_ui.m_checkServerSideUpdate->setChecked(existing_root->network()->forceServerSideUpdate()); m_details->m_ui.m_checkServerSideUpdate->setChecked(existing_root->network()->forceServerSideUpdate());
m_details->m_ui.m_checkDownloadOnlyUnreadMessages->setChecked(existing_root->network()->downloadOnlyUnreadMessages()); m_details->m_ui.m_checkDownloadOnlyUnreadMessages->setChecked(existing_root->network()->downloadOnlyUnreadMessages());
} }
void FormEditTtRssAccount::performTest() {
m_details->performTest(m_proxyDetails->proxy());
}

View file

@ -21,6 +21,9 @@ class FormEditTtRssAccount : public FormAccountDetails {
protected: protected:
virtual void setEditableAccount(ServiceRoot* editable_account); virtual void setEditableAccount(ServiceRoot* editable_account);
private slots:
void performTest();
private: private:
TtRssAccountDetails* m_details; TtRssAccountDetails* m_details;
}; };

View file

@ -56,6 +56,7 @@ void FormTtRssFeedDetails::apply() {
parent->customId().toInt(); parent->customId().toInt();
const TtRssSubscribeToFeedResponse response = root->network()->subscribeToFeed(m_feedDetails->ui.m_txtUrl->lineEdit()->text(), const TtRssSubscribeToFeedResponse response = root->network()->subscribeToFeed(m_feedDetails->ui.m_txtUrl->lineEdit()->text(),
category_id, category_id,
m_serviceRoot->networkProxy(),
m_authDetails->m_gbAuthentication->isChecked(), m_authDetails->m_gbAuthentication->isChecked(),
m_authDetails->m_txtUsername->lineEdit()->text(), m_authDetails->m_txtUsername->lineEdit()->text(),
m_authDetails->m_txtPassword->lineEdit()->text()); m_authDetails->m_txtPassword->lineEdit()->text());

View file

@ -41,7 +41,6 @@ TtRssAccountDetails::TtRssAccountDetails(QWidget* parent) : QWidget(parent) {
connect(m_ui.m_txtHttpPassword->lineEdit(), &BaseLineEdit::textChanged, this, &TtRssAccountDetails::onHttpPasswordChanged); connect(m_ui.m_txtHttpPassword->lineEdit(), &BaseLineEdit::textChanged, this, &TtRssAccountDetails::onHttpPasswordChanged);
connect(m_ui.m_txtHttpUsername->lineEdit(), &BaseLineEdit::textChanged, this, &TtRssAccountDetails::onHttpUsernameChanged); connect(m_ui.m_txtHttpUsername->lineEdit(), &BaseLineEdit::textChanged, this, &TtRssAccountDetails::onHttpUsernameChanged);
connect(m_ui.m_txtUrl->lineEdit(), &BaseLineEdit::textChanged, this, &TtRssAccountDetails::onUrlChanged); connect(m_ui.m_txtUrl->lineEdit(), &BaseLineEdit::textChanged, this, &TtRssAccountDetails::onUrlChanged);
connect(m_ui.m_btnTestSetup, &QPushButton::clicked, this, &TtRssAccountDetails::performTest);
connect(m_ui.m_gbHttpAuthentication, &QGroupBox::toggled, this, &TtRssAccountDetails::onHttpPasswordChanged); connect(m_ui.m_gbHttpAuthentication, &QGroupBox::toggled, this, &TtRssAccountDetails::onHttpPasswordChanged);
connect(m_ui.m_gbHttpAuthentication, &QGroupBox::toggled, this, &TtRssAccountDetails::onHttpUsernameChanged); connect(m_ui.m_gbHttpAuthentication, &QGroupBox::toggled, this, &TtRssAccountDetails::onHttpUsernameChanged);
connect(m_ui.m_checkShowHttpPassword, &QCheckBox::toggled, this, &TtRssAccountDetails::displayHttpPassword); connect(m_ui.m_checkShowHttpPassword, &QCheckBox::toggled, this, &TtRssAccountDetails::displayHttpPassword);
@ -63,7 +62,7 @@ void TtRssAccountDetails::displayHttpPassword(bool display) {
m_ui.m_txtHttpPassword->lineEdit()->setEchoMode(display ? QLineEdit::Normal : QLineEdit::Password); m_ui.m_txtHttpPassword->lineEdit()->setEchoMode(display ? QLineEdit::Normal : QLineEdit::Password);
} }
void TtRssAccountDetails::performTest() { void TtRssAccountDetails::performTest(const QNetworkProxy& proxy) {
TtRssNetworkFactory factory; TtRssNetworkFactory factory;
factory.setUsername(m_ui.m_txtUsername->lineEdit()->text()); factory.setUsername(m_ui.m_txtUsername->lineEdit()->text());
@ -74,7 +73,7 @@ void TtRssAccountDetails::performTest() {
factory.setAuthPassword(m_ui.m_txtHttpPassword->lineEdit()->text()); factory.setAuthPassword(m_ui.m_txtHttpPassword->lineEdit()->text());
factory.setForceServerSideUpdate(m_ui.m_checkServerSideUpdate->isChecked()); factory.setForceServerSideUpdate(m_ui.m_checkServerSideUpdate->isChecked());
TtRssLoginResponse result = factory.login(); TtRssLoginResponse result = factory.login(proxy);
if (result.isLoaded()) { if (result.isLoaded()) {
if (result.hasError()) { if (result.hasError()) {

View file

@ -7,6 +7,8 @@
#include "ui_ttrssaccountdetails.h" #include "ui_ttrssaccountdetails.h"
#include <QNetworkProxy>
class TtRssServiceRoot; class TtRssServiceRoot;
class TtRssAccountDetails : public QWidget { class TtRssAccountDetails : public QWidget {
@ -20,7 +22,7 @@ class TtRssAccountDetails : public QWidget {
private slots: private slots:
void displayPassword(bool display); void displayPassword(bool display);
void displayHttpPassword(bool display); void displayHttpPassword(bool display);
void performTest(); void performTest(const QNetworkProxy& proxy);
void onUsernameChanged(); void onUsernameChanged();
void onPasswordChanged(); void onPasswordChanged();

View file

@ -69,11 +69,11 @@ QNetworkReply::NetworkError TtRssNetworkFactory::lastError() const {
return m_lastError; return m_lastError;
} }
TtRssLoginResponse TtRssNetworkFactory::login() { TtRssLoginResponse TtRssNetworkFactory::login(const QNetworkProxy& proxy) {
if (!m_sessionId.isEmpty()) { if (!m_sessionId.isEmpty()) {
qWarningNN << LOGSEC_TTRSS qWarningNN << LOGSEC_TTRSS
<< "Session ID is not empty before login, logging out first."; << "Session ID is not empty before login, logging out first.";
logout(); logout(proxy);
} }
QJsonObject json; QJsonObject json;
@ -95,7 +95,11 @@ TtRssLoginResponse TtRssNetworkFactory::login() {
QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact), QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact),
result_raw, result_raw,
QNetworkAccessManager::Operation::PostOperation, QNetworkAccessManager::Operation::PostOperation,
headers); headers,
false,
{},
{},
proxy);
TtRssLoginResponse login_response(QString::fromUtf8(result_raw)); TtRssLoginResponse login_response(QString::fromUtf8(result_raw));
if (network_reply.first == QNetworkReply::NoError) { if (network_reply.first == QNetworkReply::NoError) {
@ -112,7 +116,7 @@ TtRssLoginResponse TtRssNetworkFactory::login() {
return login_response; return login_response;
} }
TtRssResponse TtRssNetworkFactory::logout() { TtRssResponse TtRssNetworkFactory::logout(const QNetworkProxy& proxy) {
if (!m_sessionId.isEmpty()) { if (!m_sessionId.isEmpty()) {
QJsonObject json; QJsonObject json;
@ -131,7 +135,11 @@ TtRssResponse TtRssNetworkFactory::logout() {
QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact), QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact),
result_raw, result_raw,
QNetworkAccessManager::Operation::PostOperation, QNetworkAccessManager::Operation::PostOperation,
headers); headers,
false,
{},
{},
proxy);
m_lastError = network_reply.first; m_lastError = network_reply.first;
@ -154,7 +162,7 @@ TtRssResponse TtRssNetworkFactory::logout() {
} }
} }
TtRssGetLabelsResponse TtRssNetworkFactory::getLabels() { TtRssGetLabelsResponse TtRssNetworkFactory::getLabels(const QNetworkProxy& proxy) {
QJsonObject json; QJsonObject json;
json["op"] = QSL("getLabels"); json["op"] = QSL("getLabels");
@ -176,12 +184,18 @@ TtRssGetLabelsResponse TtRssNetworkFactory::getLabels() {
if (result.isNotLoggedIn()) { if (result.isNotLoggedIn()) {
// We are not logged in. // We are not logged in.
login(); login(proxy);
json["sid"] = m_sessionId; json["sid"] = m_sessionId;
network_reply = NetworkFactory::performNetworkOperation(m_fullUrl, timeout, QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact), network_reply = NetworkFactory::performNetworkOperation(m_fullUrl,
timeout,
QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact),
result_raw, result_raw,
QNetworkAccessManager::Operation::PostOperation, QNetworkAccessManager::Operation::PostOperation,
headers); headers,
false,
{},
{},
proxy);
result = TtRssGetLabelsResponse(QString::fromUtf8(result_raw)); result = TtRssGetLabelsResponse(QString::fromUtf8(result_raw));
} }
@ -195,7 +209,7 @@ TtRssGetLabelsResponse TtRssNetworkFactory::getLabels() {
return result; return result;
} }
TtRssGetFeedsCategoriesResponse TtRssNetworkFactory::getFeedsCategories() { TtRssGetFeedsCategoriesResponse TtRssNetworkFactory::getFeedsCategories(const QNetworkProxy& proxy) {
QJsonObject json; QJsonObject json;
json["op"] = QSL("getFeedTree"); json["op"] = QSL("getFeedTree");
@ -212,17 +226,27 @@ TtRssGetFeedsCategoriesResponse TtRssNetworkFactory::getFeedsCategories() {
QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact), QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact),
result_raw, result_raw,
QNetworkAccessManager::Operation::PostOperation, QNetworkAccessManager::Operation::PostOperation,
headers); headers,
false,
{},
{},
proxy);
TtRssGetFeedsCategoriesResponse result(QString::fromUtf8(result_raw)); TtRssGetFeedsCategoriesResponse result(QString::fromUtf8(result_raw));
if (result.isNotLoggedIn()) { if (result.isNotLoggedIn()) {
// We are not logged in. // We are not logged in.
login(); login(proxy);
json["sid"] = m_sessionId; json["sid"] = m_sessionId;
network_reply = NetworkFactory::performNetworkOperation(m_fullUrl, timeout, QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact), network_reply = NetworkFactory::performNetworkOperation(m_fullUrl,
timeout,
QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact),
result_raw, result_raw,
QNetworkAccessManager::Operation::PostOperation, QNetworkAccessManager::Operation::PostOperation,
headers); headers,
false,
{},
{},
proxy);
result = TtRssGetFeedsCategoriesResponse(QString::fromUtf8(result_raw)); result = TtRssGetFeedsCategoriesResponse(QString::fromUtf8(result_raw));
} }
@ -238,7 +262,8 @@ TtRssGetFeedsCategoriesResponse TtRssNetworkFactory::getFeedsCategories() {
TtRssGetHeadlinesResponse TtRssNetworkFactory::getHeadlines(int feed_id, int limit, int skip, TtRssGetHeadlinesResponse TtRssNetworkFactory::getHeadlines(int feed_id, int limit, int skip,
bool show_content, bool include_attachments, bool show_content, bool include_attachments,
bool sanitize, bool unread_only) { bool sanitize, bool unread_only,
const QNetworkProxy& proxy) {
QJsonObject json; QJsonObject json;
json["op"] = QSL("getHeadlines"); json["op"] = QSL("getHeadlines");
@ -258,21 +283,32 @@ TtRssGetHeadlinesResponse TtRssNetworkFactory::getHeadlines(int feed_id, int lim
headers << QPair<QByteArray, QByteArray>(HTTP_HEADERS_CONTENT_TYPE, TTRSS_CONTENT_TYPE_JSON); headers << QPair<QByteArray, QByteArray>(HTTP_HEADERS_CONTENT_TYPE, TTRSS_CONTENT_TYPE_JSON);
headers << NetworkFactory::generateBasicAuthHeader(m_authUsername, m_authPassword); headers << NetworkFactory::generateBasicAuthHeader(m_authUsername, m_authPassword);
NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_fullUrl, timeout, NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_fullUrl,
timeout,
QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact), QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact),
result_raw, result_raw,
QNetworkAccessManager::Operation::PostOperation, QNetworkAccessManager::Operation::PostOperation,
headers); headers,
false,
{},
{},
proxy);
TtRssGetHeadlinesResponse result(QString::fromUtf8(result_raw)); TtRssGetHeadlinesResponse result(QString::fromUtf8(result_raw));
if (result.isNotLoggedIn()) { if (result.isNotLoggedIn()) {
// We are not logged in. // We are not logged in.
login(); login(proxy);
json["sid"] = m_sessionId; json["sid"] = m_sessionId;
network_reply = NetworkFactory::performNetworkOperation(m_fullUrl, timeout, QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact), network_reply = NetworkFactory::performNetworkOperation(m_fullUrl,
timeout,
QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact),
result_raw, result_raw,
QNetworkAccessManager::Operation::PostOperation, QNetworkAccessManager::Operation::PostOperation,
headers); headers,
false,
{},
{},
proxy);
result = TtRssGetHeadlinesResponse(QString::fromUtf8(result_raw)); result = TtRssGetHeadlinesResponse(QString::fromUtf8(result_raw));
} }
@ -286,7 +322,8 @@ TtRssGetHeadlinesResponse TtRssNetworkFactory::getHeadlines(int feed_id, int lim
return result; return result;
} }
TtRssResponse TtRssNetworkFactory::setArticleLabel(const QStringList& article_ids, const QString& label_custom_id, bool assign) { TtRssResponse TtRssNetworkFactory::setArticleLabel(const QStringList& article_ids, const QString& label_custom_id,
bool assign, const QNetworkProxy& proxy) {
QJsonObject json; QJsonObject json;
json["op"] = QSL("setArticleLabel"); json["op"] = QSL("setArticleLabel");
@ -302,21 +339,32 @@ TtRssResponse TtRssNetworkFactory::setArticleLabel(const QStringList& article_id
headers << QPair<QByteArray, QByteArray>(HTTP_HEADERS_CONTENT_TYPE, TTRSS_CONTENT_TYPE_JSON); headers << QPair<QByteArray, QByteArray>(HTTP_HEADERS_CONTENT_TYPE, TTRSS_CONTENT_TYPE_JSON);
headers << NetworkFactory::generateBasicAuthHeader(m_authUsername, m_authPassword); headers << NetworkFactory::generateBasicAuthHeader(m_authUsername, m_authPassword);
NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_fullUrl, timeout, NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_fullUrl,
timeout,
QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact), QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact),
result_raw, result_raw,
QNetworkAccessManager::Operation::PostOperation, QNetworkAccessManager::Operation::PostOperation,
headers); headers,
false,
{},
{},
proxy);
TtRssResponse result(QString::fromUtf8(result_raw)); TtRssResponse result(QString::fromUtf8(result_raw));
if (result.isNotLoggedIn()) { if (result.isNotLoggedIn()) {
// We are not logged in. // We are not logged in.
login(); login(proxy);
json["sid"] = m_sessionId; json["sid"] = m_sessionId;
network_reply = NetworkFactory::performNetworkOperation(m_fullUrl, timeout, QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact), network_reply = NetworkFactory::performNetworkOperation(m_fullUrl,
timeout,
QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact),
result_raw, result_raw,
QNetworkAccessManager::Operation::PostOperation, QNetworkAccessManager::Operation::PostOperation,
headers); headers,
false,
{},
{},
proxy);
result = TtRssResponse(QString::fromUtf8(result_raw)); result = TtRssResponse(QString::fromUtf8(result_raw));
} }
@ -332,7 +380,8 @@ TtRssResponse TtRssNetworkFactory::setArticleLabel(const QStringList& article_id
TtRssUpdateArticleResponse TtRssNetworkFactory::updateArticles(const QStringList& ids, TtRssUpdateArticleResponse TtRssNetworkFactory::updateArticles(const QStringList& ids,
UpdateArticle::OperatingField field, UpdateArticle::OperatingField field,
UpdateArticle::Mode mode) { UpdateArticle::Mode mode,
const QNetworkProxy& proxy) {
QJsonObject json; QJsonObject json;
json["op"] = QSL("updateArticle"); json["op"] = QSL("updateArticle");
@ -348,21 +397,32 @@ TtRssUpdateArticleResponse TtRssNetworkFactory::updateArticles(const QStringList
headers << QPair<QByteArray, QByteArray>(HTTP_HEADERS_CONTENT_TYPE, TTRSS_CONTENT_TYPE_JSON); headers << QPair<QByteArray, QByteArray>(HTTP_HEADERS_CONTENT_TYPE, TTRSS_CONTENT_TYPE_JSON);
headers << NetworkFactory::generateBasicAuthHeader(m_authUsername, m_authPassword); headers << NetworkFactory::generateBasicAuthHeader(m_authUsername, m_authPassword);
NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_fullUrl, timeout, NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_fullUrl,
timeout,
QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact), QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact),
result_raw, result_raw,
QNetworkAccessManager::Operation::PostOperation, QNetworkAccessManager::Operation::PostOperation,
headers); headers,
false,
{},
{},
proxy);
TtRssUpdateArticleResponse result(QString::fromUtf8(result_raw)); TtRssUpdateArticleResponse result(QString::fromUtf8(result_raw));
if (result.isNotLoggedIn()) { if (result.isNotLoggedIn()) {
// We are not logged in. // We are not logged in.
login(); login(proxy);
json["sid"] = m_sessionId; json["sid"] = m_sessionId;
network_reply = NetworkFactory::performNetworkOperation(m_fullUrl, timeout, QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact), network_reply = NetworkFactory::performNetworkOperation(m_fullUrl,
timeout,
QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact),
result_raw, result_raw,
QNetworkAccessManager::Operation::PostOperation, QNetworkAccessManager::Operation::PostOperation,
headers); headers,
false,
{},
{},
proxy);
result = TtRssUpdateArticleResponse(QString::fromUtf8(result_raw)); result = TtRssUpdateArticleResponse(QString::fromUtf8(result_raw));
} }
@ -377,6 +437,7 @@ TtRssUpdateArticleResponse TtRssNetworkFactory::updateArticles(const QStringList
} }
TtRssSubscribeToFeedResponse TtRssNetworkFactory::subscribeToFeed(const QString& url, int category_id, TtRssSubscribeToFeedResponse TtRssNetworkFactory::subscribeToFeed(const QString& url, int category_id,
const QNetworkProxy& proxy,
bool protectd, const QString& username, bool protectd, const QString& username,
const QString& password) { const QString& password) {
QJsonObject json; QJsonObject json;
@ -398,21 +459,32 @@ TtRssSubscribeToFeedResponse TtRssNetworkFactory::subscribeToFeed(const QString&
headers << QPair<QByteArray, QByteArray>(HTTP_HEADERS_CONTENT_TYPE, TTRSS_CONTENT_TYPE_JSON); headers << QPair<QByteArray, QByteArray>(HTTP_HEADERS_CONTENT_TYPE, TTRSS_CONTENT_TYPE_JSON);
headers << NetworkFactory::generateBasicAuthHeader(m_authUsername, m_authPassword); headers << NetworkFactory::generateBasicAuthHeader(m_authUsername, m_authPassword);
NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_fullUrl, timeout, NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_fullUrl,
timeout,
QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact), QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact),
result_raw, result_raw,
QNetworkAccessManager::Operation::PostOperation, QNetworkAccessManager::Operation::PostOperation,
headers); headers,
false,
{},
{},
proxy);
TtRssSubscribeToFeedResponse result(QString::fromUtf8(result_raw)); TtRssSubscribeToFeedResponse result(QString::fromUtf8(result_raw));
if (result.isNotLoggedIn()) { if (result.isNotLoggedIn()) {
// We are not logged in. // We are not logged in.
login(); login(proxy);
json["sid"] = m_sessionId; json["sid"] = m_sessionId;
network_reply = NetworkFactory::performNetworkOperation(m_fullUrl, timeout, QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact), network_reply = NetworkFactory::performNetworkOperation(m_fullUrl,
timeout,
QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact),
result_raw, result_raw,
QNetworkAccessManager::Operation::PostOperation, QNetworkAccessManager::Operation::PostOperation,
headers); headers,
false,
{},
{},
proxy);
result = TtRssSubscribeToFeedResponse(QString::fromUtf8(result_raw)); result = TtRssSubscribeToFeedResponse(QString::fromUtf8(result_raw));
} }
@ -426,7 +498,7 @@ TtRssSubscribeToFeedResponse TtRssNetworkFactory::subscribeToFeed(const QString&
return result; return result;
} }
TtRssUnsubscribeFeedResponse TtRssNetworkFactory::unsubscribeFeed(int feed_id) { TtRssUnsubscribeFeedResponse TtRssNetworkFactory::unsubscribeFeed(int feed_id, const QNetworkProxy& proxy) {
QJsonObject json; QJsonObject json;
json["op"] = QSL("unsubscribeFeed"); json["op"] = QSL("unsubscribeFeed");
@ -444,17 +516,27 @@ TtRssUnsubscribeFeedResponse TtRssNetworkFactory::unsubscribeFeed(int feed_id) {
QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact), QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact),
result_raw, result_raw,
QNetworkAccessManager::Operation::PostOperation, QNetworkAccessManager::Operation::PostOperation,
headers); headers,
false,
{},
{},
proxy);
TtRssUnsubscribeFeedResponse result(QString::fromUtf8(result_raw)); TtRssUnsubscribeFeedResponse result(QString::fromUtf8(result_raw));
if (result.isNotLoggedIn()) { if (result.isNotLoggedIn()) {
// We are not logged in. // We are not logged in.
login(); login(proxy);
json["sid"] = m_sessionId; json["sid"] = m_sessionId;
network_reply = NetworkFactory::performNetworkOperation(m_fullUrl, timeout, QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact), network_reply = NetworkFactory::performNetworkOperation(m_fullUrl,
timeout,
QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact),
result_raw, result_raw,
QNetworkAccessManager::Operation::PostOperation, QNetworkAccessManager::Operation::PostOperation,
headers); headers,
false,
{},
{},
proxy);
result = TtRssUnsubscribeFeedResponse(QString::fromUtf8(result_raw)); result = TtRssUnsubscribeFeedResponse(QString::fromUtf8(result_raw));
} }

View file

@ -100,17 +100,18 @@ namespace UpdateArticle {
SetToTrue = 1, SetToTrue = 1,
Togggle = 2 Togggle = 2
}; };
enum class OperatingField { enum class OperatingField {
Starred = 0, Starred = 0,
Published = 1, Published = 1,
Unread = 2 Unread = 2
}; };
} }
class TtRssNetworkFactory { class TtRssNetworkFactory {
public: public:
explicit TtRssNetworkFactory(); explicit TtRssNetworkFactory();
virtual ~TtRssNetworkFactory() = default;
QString url() const; QString url() const;
void setUrl(const QString& url); void setUrl(const QString& url);
@ -143,32 +144,36 @@ class TtRssNetworkFactory {
// Operations. // Operations.
// Logs user in. // Logs user in.
TtRssLoginResponse login(); TtRssLoginResponse login(const QNetworkProxy& proxy);
// Logs user out. // Logs user out.
TtRssResponse logout(); TtRssResponse logout(const QNetworkProxy& proxy);
// Gets list of labels from the server. // Gets list of labels from the server.
TtRssGetLabelsResponse getLabels(); TtRssGetLabelsResponse getLabels(const QNetworkProxy& proxy);
// Gets feeds from the server. // Gets feeds from the server.
TtRssGetFeedsCategoriesResponse getFeedsCategories(); TtRssGetFeedsCategoriesResponse getFeedsCategories(const QNetworkProxy& proxy);
// Gets headlines (messages) from the server. // Gets headlines (messages) from the server.
TtRssGetHeadlinesResponse getHeadlines(int feed_id, int limit, int skip, TtRssGetHeadlinesResponse getHeadlines(int feed_id, int limit, int skip,
bool show_content, bool include_attachments, bool show_content, bool include_attachments,
bool sanitize, bool unread_only); bool sanitize, bool unread_only,
const QNetworkProxy& proxy);
TtRssResponse setArticleLabel(const QStringList& article_ids, const QString& label_custom_id, bool assign); TtRssResponse setArticleLabel(const QStringList& article_ids, const QString& label_custom_id,
bool assign, const QNetworkProxy& proxy);
TtRssUpdateArticleResponse updateArticles(const QStringList& ids, TtRssUpdateArticleResponse updateArticles(const QStringList& ids,
UpdateArticle::OperatingField field, UpdateArticle::OperatingField field,
UpdateArticle::Mode mode); UpdateArticle::Mode mode,
const QNetworkProxy& proxy);
TtRssSubscribeToFeedResponse subscribeToFeed(const QString& url, int category_id, bool protectd = false, TtRssSubscribeToFeedResponse subscribeToFeed(const QString& url, int category_id, const QNetworkProxy& proxy,
const QString& username = QString(), const QString& password = QString()); bool protectd = false, const QString& username = QString(),
const QString& password = QString());
TtRssUnsubscribeFeedResponse unsubscribeFeed(int feed_id); TtRssUnsubscribeFeedResponse unsubscribeFeed(int feed_id, const QNetworkProxy& proxy);
private: private:
QString m_bareUrl; QString m_bareUrl;

View file

@ -28,7 +28,8 @@ bool TtRssFeed::canBeDeleted() const {
} }
bool TtRssFeed::deleteViaGui() { bool TtRssFeed::deleteViaGui() {
TtRssUnsubscribeFeedResponse response = serviceRoot()->network()->unsubscribeFeed(customId().toInt()); TtRssUnsubscribeFeedResponse response = serviceRoot()->network()->unsubscribeFeed(customNumericId(),
getParentServiceRoot()->networkProxy());
if (response.code() == UFF_OK && removeItself()) { if (response.code() == UFF_OK && removeItself()) {
serviceRoot()->requestItemRemoval(this); serviceRoot()->requestItemRemoval(this);
@ -51,7 +52,8 @@ QList<Message> TtRssFeed::obtainNewMessages(bool* error_during_obtaining) {
do { do {
TtRssGetHeadlinesResponse headlines = serviceRoot()->network()->getHeadlines(customId().toInt(), limit, skip, TtRssGetHeadlinesResponse headlines = serviceRoot()->network()->getHeadlines(customId().toInt(), limit, skip,
true, true, false, true, true, false,
serviceRoot()->network()->downloadOnlyUnreadMessages()); serviceRoot()->network()->downloadOnlyUnreadMessages(),
getParentServiceRoot()->networkProxy());
if (serviceRoot()->network()->lastError() != QNetworkReply::NoError) { if (serviceRoot()->network()->lastError() != QNetworkReply::NoError) {
setStatus(Feed::Status::NetworkError); setStatus(Feed::Status::NetworkError);

View file

@ -47,7 +47,7 @@ void TtRssServiceRoot::start(bool freshly_activated) {
} }
void TtRssServiceRoot::stop() { void TtRssServiceRoot::stop() {
m_network->logout(); m_network->logout(networkProxy());
qDebugNN << LOGSEC_TTRSS qDebugNN << LOGSEC_TTRSS
<< "Stopping Tiny Tiny RSS account, logging out with result" << "Stopping Tiny Tiny RSS account, logging out with result"
<< QUOTE_W_SPACE_DOT(m_network->lastError()); << QUOTE_W_SPACE_DOT(m_network->lastError());
@ -132,7 +132,8 @@ void TtRssServiceRoot::saveAllCachedData(bool ignore_errors) {
UpdateArticle::OperatingField::Unread, UpdateArticle::OperatingField::Unread,
key == RootItem::ReadStatus::Unread key == RootItem::ReadStatus::Unread
? UpdateArticle::Mode::SetToTrue ? UpdateArticle::Mode::SetToTrue
: UpdateArticle::Mode::SetToFalse); : UpdateArticle::Mode::SetToFalse,
networkProxy());
if (!ignore_errors && (network()->lastError() != QNetworkReply::NetworkError::NoError || res.hasError())) { if (!ignore_errors && (network()->lastError() != QNetworkReply::NetworkError::NoError || res.hasError())) {
addMessageStatesToCache(ids, key); addMessageStatesToCache(ids, key);
@ -154,7 +155,8 @@ void TtRssServiceRoot::saveAllCachedData(bool ignore_errors) {
UpdateArticle::OperatingField::Starred, UpdateArticle::OperatingField::Starred,
key == RootItem::Importance::Important key == RootItem::Importance::Important
? UpdateArticle::Mode::SetToTrue ? UpdateArticle::Mode::SetToTrue
: UpdateArticle::Mode::SetToFalse); : UpdateArticle::Mode::SetToFalse,
networkProxy());
if (!ignore_errors && (network()->lastError() != QNetworkReply::NetworkError::NoError || res.hasError())) { if (!ignore_errors && (network()->lastError() != QNetworkReply::NetworkError::NoError || res.hasError())) {
addMessageStatesToCache(messages, key); addMessageStatesToCache(messages, key);
@ -171,7 +173,7 @@ void TtRssServiceRoot::saveAllCachedData(bool ignore_errors) {
QStringList messages = k.value(); QStringList messages = k.value();
if (!messages.isEmpty()) { if (!messages.isEmpty()) {
auto res = network()->setArticleLabel(messages, label_custom_id, true); auto res = network()->setArticleLabel(messages, label_custom_id, true, networkProxy());
if (!ignore_errors && (network()->lastError() != QNetworkReply::NetworkError::NoError || res.hasError())) { if (!ignore_errors && (network()->lastError() != QNetworkReply::NetworkError::NoError || res.hasError())) {
addLabelsAssignmentsToCache(messages, label_custom_id, true); addLabelsAssignmentsToCache(messages, label_custom_id, true);
@ -188,7 +190,7 @@ void TtRssServiceRoot::saveAllCachedData(bool ignore_errors) {
QStringList messages = l.value(); QStringList messages = l.value();
if (!messages.isEmpty()) { if (!messages.isEmpty()) {
auto res = network()->setArticleLabel(messages, label_custom_id, false); auto res = network()->setArticleLabel(messages, label_custom_id, false, networkProxy());
if (!ignore_errors && (network()->lastError() != QNetworkReply::NetworkError::NoError || res.hasError())) { if (!ignore_errors && (network()->lastError() != QNetworkReply::NetworkError::NoError || res.hasError())) {
addLabelsAssignmentsToCache(messages, label_custom_id, false); addLabelsAssignmentsToCache(messages, label_custom_id, false);
@ -256,8 +258,8 @@ void TtRssServiceRoot::updateTitle() {
} }
RootItem* TtRssServiceRoot::obtainNewTreeForSyncIn() const { RootItem* TtRssServiceRoot::obtainNewTreeForSyncIn() const {
TtRssGetFeedsCategoriesResponse feed_cats = m_network->getFeedsCategories(); TtRssGetFeedsCategoriesResponse feed_cats = m_network->getFeedsCategories(networkProxy());
TtRssGetLabelsResponse labels = m_network->getLabels(); TtRssGetLabelsResponse labels = m_network->getLabels(networkProxy());
if (m_network->lastError() == QNetworkReply::NoError) { if (m_network->lastError() == QNetworkReply::NoError) {
auto* tree = feed_cats.feedsCategories(true, m_network->url()); auto* tree = feed_cats.feedsCategories(true, m_network->url());