From 0813633173ff828a36e3a5b94c3ad973be51ce70 Mon Sep 17 00:00:00 2001 From: Thomas Piccirello Date: Wed, 27 Nov 2024 08:15:54 -0500 Subject: [PATCH] Maintain 200 status code for existing APIs This is to avoid introducing breaking changes. Without this change, these APIs would start returning a 204 due to their lack of response content. --- src/webui/api/appcontroller.cpp | 7 +- src/webui/api/authcontroller.cpp | 5 +- src/webui/api/authcontroller.h | 2 +- src/webui/api/rsscontroller.cpp | 20 ++++++ src/webui/api/searchcontroller.cpp | 16 +++++ src/webui/api/torrentcreatorcontroller.cpp | 2 + src/webui/api/torrentscontroller.cpp | 78 ++++++++++++++++++++++ src/webui/api/transfercontroller.cpp | 10 +++ 8 files changed, 137 insertions(+), 3 deletions(-) diff --git a/src/webui/api/appcontroller.cpp b/src/webui/api/appcontroller.cpp index 701160542..398f08086 100644 --- a/src/webui/api/appcontroller.cpp +++ b/src/webui/api/appcontroller.cpp @@ -123,6 +123,7 @@ void AppController::shutdownAction() { QCoreApplication::exit(); }); + setResult(QString()); } void AppController::preferencesAction() @@ -1167,6 +1168,8 @@ void AppController::setPreferencesAction() // Save preferences pref->apply(); + + setResult(QString()); } void AppController::defaultSavePathAction() @@ -1177,9 +1180,9 @@ void AppController::defaultSavePathAction() void AppController::sendTestEmailAction() { app()->sendTestEmail(); + setResult(QString()); } - void AppController::getDirectoryContentAction() { requireParams({u"dirPath"_s}); @@ -1269,6 +1272,8 @@ void AppController::setCookiesAction() } Net::DownloadManager::instance()->setAllCookies(cookies); + + setResult(QString()); } void AppController::networkInterfaceListAction() diff --git a/src/webui/api/authcontroller.cpp b/src/webui/api/authcontroller.cpp index 5c308a62e..ee52c1df6 100644 --- a/src/webui/api/authcontroller.cpp +++ b/src/webui/api/authcontroller.cpp @@ -46,11 +46,13 @@ AuthController::AuthController(ISessionManager *sessionManager, IApplication *ap void AuthController::setUsername(const QString &username) { m_username = username; + setResult(QString()); } void AuthController::setPasswordHash(const QByteArray &passwordHash) { m_passwordHash = passwordHash; + setResult(QString()); } void AuthController::loginAction() @@ -96,9 +98,10 @@ void AuthController::loginAction() } } -void AuthController::logoutAction() const +void AuthController::logoutAction() { m_sessionManager->sessionEnd(); + setResult(QString()); } bool AuthController::isBanned() const diff --git a/src/webui/api/authcontroller.h b/src/webui/api/authcontroller.h index 0a47c2338..cdd7c4cfb 100644 --- a/src/webui/api/authcontroller.h +++ b/src/webui/api/authcontroller.h @@ -52,7 +52,7 @@ public: private slots: void loginAction(); - void logoutAction() const; + void logoutAction(); private: bool isBanned() const; diff --git a/src/webui/api/rsscontroller.cpp b/src/webui/api/rsscontroller.cpp index d4308db46..8cdd1d532 100644 --- a/src/webui/api/rsscontroller.cpp +++ b/src/webui/api/rsscontroller.cpp @@ -53,6 +53,8 @@ void RSSController::addFolderAction() const nonstd::expected result = RSS::Session::instance()->addFolder(path); if (!result) throw APIError(APIErrorType::Conflict, result.error()); + + setResult(QString()); } void RSSController::addFeedAction() @@ -65,6 +67,8 @@ void RSSController::addFeedAction() const nonstd::expected result = RSS::Session::instance()->addFeed(url, (path.isEmpty() ? url : path), std::chrono::seconds(refreshInterval)); if (!result) throw APIError(APIErrorType::Conflict, result.error()); + + setResult(QString()); } void RSSController::setFeedURLAction() @@ -76,6 +80,8 @@ void RSSController::setFeedURLAction() const nonstd::expected result = RSS::Session::instance()->setFeedURL(path, url); if (!result) throw APIError(APIErrorType::Conflict, result.error()); + + setResult(QString()); } void RSSController::setFeedRefreshIntervalAction() @@ -103,6 +109,8 @@ void RSSController::removeItemAction() const nonstd::expected result = RSS::Session::instance()->removeItem(path); if (!result) throw APIError(APIErrorType::Conflict, result.error()); + + setResult(QString()); } void RSSController::moveItemAction() @@ -114,6 +122,8 @@ void RSSController::moveItemAction() const nonstd::expected result = RSS::Session::instance()->moveItem(itemPath, destPath); if (!result) throw APIError(APIErrorType::Conflict, result.error()); + + setResult(QString()); } void RSSController::itemsAction() @@ -148,6 +158,8 @@ void RSSController::markAsReadAction() { item->markAsRead(); } + + setResult(QString()); } void RSSController::refreshItemAction() @@ -158,6 +170,8 @@ void RSSController::refreshItemAction() RSS::Item *item = RSS::Session::instance()->itemByPath(itemPath); if (item) item->refresh(); + + setResult(QString()); } void RSSController::setRuleAction() @@ -169,6 +183,8 @@ void RSSController::setRuleAction() const auto jsonObj = QJsonDocument::fromJson(ruleDef).object(); RSS::AutoDownloader::instance()->setRule(RSS::AutoDownloadRule::fromJsonObject(jsonObj, ruleName)); + + setResult(QString()); } void RSSController::renameRuleAction() @@ -179,6 +195,8 @@ void RSSController::renameRuleAction() const QString newRuleName {params()[u"newRuleName"_s]}; RSS::AutoDownloader::instance()->renameRule(ruleName, newRuleName); + + setResult(QString()); } void RSSController::removeRuleAction() @@ -187,6 +205,8 @@ void RSSController::removeRuleAction() const QString ruleName {params()[u"ruleName"_s]}; RSS::AutoDownloader::instance()->removeRule(ruleName); + + setResult(QString()); } void RSSController::rulesAction() diff --git a/src/webui/api/searchcontroller.cpp b/src/webui/api/searchcontroller.cpp index d7b0c9786..2af76a0f4 100644 --- a/src/webui/api/searchcontroller.cpp +++ b/src/webui/api/searchcontroller.cpp @@ -142,6 +142,8 @@ void SearchController::stopAction() searchHandler->cancelSearch(); m_activeSearches.remove(id); } + + setResult(QString()); } void SearchController::statusAction() @@ -215,6 +217,8 @@ void SearchController::deleteAction() searchHandler->cancelSearch(); m_activeSearches.remove(id); m_searchHandlers.erase(iter); + + setResult(QString()); } void SearchController::downloadTorrentAction() @@ -238,6 +242,8 @@ void SearchController::downloadTorrentAction() downloadHandler->deleteLater(); }); } + + setResult(QString()); } void SearchController::pluginsAction() @@ -253,6 +259,8 @@ void SearchController::installPluginAction() const QStringList sources = params()[u"sources"_s].split(u'|'); for (const QString &source : sources) SearchPluginManager::instance()->installPlugin(source); + + setResult(QString()); } void SearchController::uninstallPluginAction() @@ -262,6 +270,8 @@ void SearchController::uninstallPluginAction() const QStringList names = params()[u"names"_s].split(u'|'); for (const QString &name : names) SearchPluginManager::instance()->uninstallPlugin(name.trimmed()); + + setResult(QString()); } void SearchController::enablePluginAction() @@ -273,6 +283,8 @@ void SearchController::enablePluginAction() for (const QString &name : names) SearchPluginManager::instance()->enablePlugin(name.trimmed(), enable); + + setResult(QString()); } void SearchController::updatePluginsAction() @@ -282,6 +294,8 @@ void SearchController::updatePluginsAction() connect(pluginManager, &SearchPluginManager::checkForUpdatesFinished, this, &SearchController::checkForUpdatesFinished); connect(pluginManager, &SearchPluginManager::checkForUpdatesFailed, this, &SearchController::checkForUpdatesFailed); pluginManager->checkForUpdates(); + + setResult(QString()); } void SearchController::checkForUpdatesFinished(const QHash &updateInfo) @@ -300,6 +314,8 @@ void SearchController::checkForUpdatesFinished(const QHashupdatePlugin(pluginName); } + + setResult(QString()); } void SearchController::checkForUpdatesFailed(const QString &reason) diff --git a/src/webui/api/torrentcreatorcontroller.cpp b/src/webui/api/torrentcreatorcontroller.cpp index e3f3769e7..35e2ce849 100644 --- a/src/webui/api/torrentcreatorcontroller.cpp +++ b/src/webui/api/torrentcreatorcontroller.cpp @@ -256,4 +256,6 @@ void TorrentCreatorController::deleteTaskAction() if (!m_torrentCreationManager->deleteTask(id)) throw APIError(APIErrorType::NotFound); + + setResult(QString()); } diff --git a/src/webui/api/torrentscontroller.cpp b/src/webui/api/torrentscontroller.cpp index 3e18f6e30..6981c9047 100644 --- a/src/webui/api/torrentscontroller.cpp +++ b/src/webui/api/torrentscontroller.cpp @@ -624,6 +624,8 @@ void TorrentsController::addWebSeedsAction() } torrent->addUrlSeeds(urls); + + setResult(QString()); } void TorrentsController::editWebSeedAction() @@ -656,6 +658,8 @@ void TorrentsController::editWebSeedAction() torrent->removeUrlSeeds({origUrl}); torrent->addUrlSeeds({newUrl}); } + + setResult(QString()); } void TorrentsController::removeWebSeedsAction() @@ -679,6 +683,8 @@ void TorrentsController::removeWebSeedsAction() } torrent->removeUrlSeeds(urls); + + setResult(QString()); } // Returns the files in a torrent in JSON format. @@ -919,6 +925,8 @@ void TorrentsController::addTrackersAction() const QList entries = BitTorrent::parseTrackerEntries(params()[u"urls"_s]); torrent->addTrackers(entries); + + setResult(QString()); } void TorrentsController::editTrackerAction() @@ -972,6 +980,8 @@ void TorrentsController::editTrackerAction() if (!torrent->isStopped()) torrent->forceReannounce(); + + setResult(QString()); } void TorrentsController::removeTrackersAction() @@ -1006,6 +1016,8 @@ void TorrentsController::removeTrackersAction() for (BitTorrent::Torrent *const torrent : asConst(torrents)) torrent->removeTrackers(urls); + + setResult(QString()); } void TorrentsController::addPeersAction() @@ -1052,6 +1064,8 @@ void TorrentsController::stopAction() const QStringList hashes = params()[u"hashes"_s].split(u'|'); applyToTorrents(hashes, [](BitTorrent::Torrent *const torrent) { torrent->stop(); }); + + setResult(QString()); } void TorrentsController::startAction() @@ -1060,6 +1074,8 @@ void TorrentsController::startAction() const QStringList idStrings = params()[u"hashes"_s].split(u'|'); applyToTorrents(idStrings, [](BitTorrent::Torrent *const torrent) { torrent->start(); }); + + setResult(QString()); } void TorrentsController::filePrioAction() @@ -1101,6 +1117,8 @@ void TorrentsController::filePrioAction() if (priorityChanged) torrent->prioritizeFiles(priorities); + + setResult(QString()); } void TorrentsController::uploadLimitAction() @@ -1149,6 +1167,8 @@ void TorrentsController::setUploadLimitAction() const QStringList hashes {params()[u"hashes"_s].split(u'|')}; applyToTorrents(hashes, [limit](BitTorrent::Torrent *const torrent) { torrent->setUploadLimit(limit); }); + + setResult(QString()); } void TorrentsController::setDownloadLimitAction() @@ -1161,6 +1181,8 @@ void TorrentsController::setDownloadLimitAction() const QStringList hashes {params()[u"hashes"_s].split(u'|')}; applyToTorrents(hashes, [limit](BitTorrent::Torrent *const torrent) { torrent->setDownloadLimit(limit); }); + + setResult(QString()); } void TorrentsController::setShareLimitsAction() @@ -1178,6 +1200,8 @@ void TorrentsController::setShareLimitsAction() torrent->setSeedingTimeLimit(seedingTimeLimit); torrent->setInactiveSeedingTimeLimit(inactiveSeedingTimeLimit); }); + + setResult(QString()); } void TorrentsController::toggleSequentialDownloadAction() @@ -1186,6 +1210,8 @@ void TorrentsController::toggleSequentialDownloadAction() const QStringList hashes {params()[u"hashes"_s].split(u'|')}; applyToTorrents(hashes, [](BitTorrent::Torrent *const torrent) { torrent->toggleSequentialDownload(); }); + + setResult(QString()); } void TorrentsController::toggleFirstLastPiecePrioAction() @@ -1194,6 +1220,8 @@ void TorrentsController::toggleFirstLastPiecePrioAction() const QStringList hashes {params()[u"hashes"_s].split(u'|')}; applyToTorrents(hashes, [](BitTorrent::Torrent *const torrent) { torrent->toggleFirstLastPiecePriority(); }); + + setResult(QString()); } void TorrentsController::setSuperSeedingAction() @@ -1203,6 +1231,8 @@ void TorrentsController::setSuperSeedingAction() const bool value {parseBool(params()[u"value"_s]).value_or(false)}; const QStringList hashes {params()[u"hashes"_s].split(u'|')}; applyToTorrents(hashes, [value](BitTorrent::Torrent *const torrent) { torrent->setSuperSeeding(value); }); + + setResult(QString()); } void TorrentsController::setForceStartAction() @@ -1215,6 +1245,8 @@ void TorrentsController::setForceStartAction() { torrent->start(value ? BitTorrent::TorrentOperatingMode::Forced : BitTorrent::TorrentOperatingMode::AutoManaged); }); + + setResult(QString()); } void TorrentsController::deleteAction() @@ -1228,6 +1260,8 @@ void TorrentsController::deleteAction() { BitTorrent::Session::instance()->removeTorrent(torrent->id(), deleteOption); }); + + setResult(QString()); } void TorrentsController::increasePrioAction() @@ -1239,6 +1273,8 @@ void TorrentsController::increasePrioAction() const QStringList hashes {params()[u"hashes"_s].split(u'|')}; BitTorrent::Session::instance()->increaseTorrentsQueuePos(toTorrentIDs(hashes)); + + setResult(QString()); } void TorrentsController::decreasePrioAction() @@ -1250,6 +1286,8 @@ void TorrentsController::decreasePrioAction() const QStringList hashes {params()[u"hashes"_s].split(u'|')}; BitTorrent::Session::instance()->decreaseTorrentsQueuePos(toTorrentIDs(hashes)); + + setResult(QString()); } void TorrentsController::topPrioAction() @@ -1261,6 +1299,8 @@ void TorrentsController::topPrioAction() const QStringList hashes {params()[u"hashes"_s].split(u'|')}; BitTorrent::Session::instance()->topTorrentsQueuePos(toTorrentIDs(hashes)); + + setResult(QString()); } void TorrentsController::bottomPrioAction() @@ -1272,6 +1312,8 @@ void TorrentsController::bottomPrioAction() const QStringList hashes {params()[u"hashes"_s].split(u'|')}; BitTorrent::Session::instance()->bottomTorrentsQueuePos(toTorrentIDs(hashes)); + + setResult(QString()); } void TorrentsController::setLocationAction() @@ -1295,6 +1337,8 @@ void TorrentsController::setLocationAction() torrent->setAutoTMMEnabled(false); torrent->setSavePath(newLocation); }); + + setResult(QString()); } void TorrentsController::setSavePathAction() @@ -1320,6 +1364,8 @@ void TorrentsController::setSavePathAction() if (!torrent->isAutoTMMEnabled()) torrent->setSavePath(newPath); }); + + setResult(QString()); } void TorrentsController::setDownloadPathAction() @@ -1345,6 +1391,8 @@ void TorrentsController::setDownloadPathAction() if (!torrent->isAutoTMMEnabled()) torrent->setDownloadPath(newPath); }); + + setResult(QString()); } void TorrentsController::renameAction() @@ -1363,6 +1411,8 @@ void TorrentsController::renameAction() name.replace(QRegularExpression(u"\r?\n|\r"_s), u" "_s); torrent->setName(name); + + setResult(QString()); } void TorrentsController::setAutoManagementAction() @@ -1376,6 +1426,8 @@ void TorrentsController::setAutoManagementAction() { torrent->setAutoTMMEnabled(isEnabled); }); + + setResult(QString()); } void TorrentsController::recheckAction() @@ -1384,6 +1436,8 @@ void TorrentsController::recheckAction() const QStringList hashes {params()[u"hashes"_s].split(u'|')}; applyToTorrents(hashes, [](BitTorrent::Torrent *const torrent) { torrent->forceRecheck(); }); + + setResult(QString()); } void TorrentsController::reannounceAction() @@ -1392,6 +1446,8 @@ void TorrentsController::reannounceAction() const QStringList hashes {params()[u"hashes"_s].split(u'|')}; applyToTorrents(hashes, [](BitTorrent::Torrent *const torrent) { torrent->forceReannounce(); }); + + setResult(QString()); } void TorrentsController::setCategoryAction() @@ -1406,6 +1462,8 @@ void TorrentsController::setCategoryAction() if (!torrent->setCategory(category)) throw APIError(APIErrorType::Conflict, tr("Incorrect category name")); }); + + setResult(QString()); } void TorrentsController::createCategoryAction() @@ -1431,6 +1489,8 @@ void TorrentsController::createCategoryAction() if (!BitTorrent::Session::instance()->addCategory(category, categoryOptions)) throw APIError(APIErrorType::Conflict, tr("Unable to create category")); + + setResult(QString()); } void TorrentsController::editCategoryAction() @@ -1453,6 +1513,8 @@ void TorrentsController::editCategoryAction() if (!BitTorrent::Session::instance()->editCategory(category, categoryOptions)) throw APIError(APIErrorType::Conflict, tr("Unable to edit category")); + + setResult(QString()); } void TorrentsController::removeCategoriesAction() @@ -1462,6 +1524,8 @@ void TorrentsController::removeCategoriesAction() const QStringList categories {params()[u"categories"_s].split(u'\n')}; for (const QString &category : categories) BitTorrent::Session::instance()->removeCategory(category); + + setResult(QString()); } void TorrentsController::categoriesAction() @@ -1497,6 +1561,8 @@ void TorrentsController::addTagsAction() torrent->addTag(Tag(tagStr)); }); } + + setResult(QString()); } void TorrentsController::setTagsAction() @@ -1542,6 +1608,8 @@ void TorrentsController::removeTagsAction() torrent->removeAllTags(); }); } + + setResult(QString()); } void TorrentsController::createTagsAction() @@ -1552,6 +1620,8 @@ void TorrentsController::createTagsAction() for (const QString &tagStr : tags) BitTorrent::Session::instance()->addTag(Tag(tagStr)); + + setResult(QString()); } void TorrentsController::deleteTagsAction() @@ -1561,6 +1631,8 @@ void TorrentsController::deleteTagsAction() const QStringList tags {params()[u"tags"_s].split(u',', Qt::SkipEmptyParts)}; for (const QString &tagStr : tags) BitTorrent::Session::instance()->removeTag(Tag(tagStr)); + + setResult(QString()); } void TorrentsController::tagsAction() @@ -1591,6 +1663,8 @@ void TorrentsController::renameFileAction() { throw APIError(APIErrorType::Conflict, error.message()); } + + setResult(QString()); } void TorrentsController::renameFolderAction() @@ -1613,6 +1687,8 @@ void TorrentsController::renameFolderAction() { throw APIError(APIErrorType::Conflict, error.message()); } + + setResult(QString()); } void TorrentsController::exportAction() @@ -1669,4 +1745,6 @@ void TorrentsController::setSSLParametersAction() throw APIError(APIErrorType::BadData); torrent->setSSLParameters(sslParams); + + setResult(QString()); } diff --git a/src/webui/api/transfercontroller.cpp b/src/webui/api/transfercontroller.cpp index 66ecb2747..8ef1c5803 100644 --- a/src/webui/api/transfercontroller.cpp +++ b/src/webui/api/transfercontroller.cpp @@ -104,6 +104,8 @@ void TransferController::setUploadLimitAction() if (limit == 0) limit = -1; BitTorrent::Session::instance()->setUploadSpeedLimit(limit); + + setResult(QString()); } void TransferController::setDownloadLimitAction() @@ -113,12 +115,16 @@ void TransferController::setDownloadLimitAction() if (limit == 0) limit = -1; BitTorrent::Session::instance()->setDownloadSpeedLimit(limit); + + setResult(QString()); } void TransferController::toggleSpeedLimitsModeAction() { BitTorrent::Session *const session = BitTorrent::Session::instance(); session->setAltGlobalSpeedLimitEnabled(!session->isAltGlobalSpeedLimitEnabled()); + + setResult(QString()); } void TransferController::speedLimitsModeAction() @@ -136,6 +142,8 @@ void TransferController::setSpeedLimitsModeAction() // Any non-zero values are considered as alternative mode BitTorrent::Session::instance()->setAltGlobalSpeedLimitEnabled(mode != 0); + + setResult(QString()); } void TransferController::banPeersAction() @@ -149,4 +157,6 @@ void TransferController::banPeersAction() if (!addr.ip.isNull()) BitTorrent::Session::instance()->banIP(addr.ip.toString()); } + + setResult(QString()); }