mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-09-21 09:05:10 -07:00
Addresses ZeldaZach's round-4 review nits: - Dispatch now resolves the cached-redirect chain before the in-flight gate, so a redirect learned after a URL was queued can no longer bypass the MAX_IN_FLIGHT_PER_HOST cap and drain the whole queue onto the redirect target, which may carry its own developer cap. processSingleRequest does the same so the allowance math keys on the host that is actually hit. - The per-host in-flight slot is released when the reply is destroyed (with the worker as the connection context) rather than on a 'finished' connection bound to the work object, so an aborted reply or a work object deleted while a reply is pending can never permanently shrink the fast path's concurrency. - storeSettings only prunes limits for hosts with neither a URL nor a developer cap, so throttles on redirect targets (api.scryfall.com -> cards.scryfall.io) survive URL removal. - Unlocked hosts are offered 0..UNLOCKED_HOST_LIMIT_MAX (50) in the rate limit dialog, matching clampHostRequestLimit() and the documented hand-editable range, so values written into downloads.ini are no longer silently rewritten on the next edit.
80 lines
3.1 KiB
C++
80 lines
3.1 KiB
C++
/**
|
|
* @file download_settings.h
|
|
* @ingroup NetworkSettings
|
|
*/
|
|
//! \todo Document this file.
|
|
|
|
#ifndef COCKATRICE_DOWNLOADSETTINGS_H
|
|
#define COCKATRICE_DOWNLOADSETTINGS_H
|
|
|
|
#include "settings_manager.h"
|
|
|
|
#include <QHash>
|
|
|
|
class DownloadSettings : public SettingsManager
|
|
{
|
|
Q_OBJECT
|
|
friend class SettingsCache;
|
|
|
|
static const QStringList DEFAULT_DOWNLOAD_URLS;
|
|
static const QString SCRYFALL_NAMED_LOCALIZED_URL;
|
|
static const QHash<QString, int> DEVELOPER_HOST_CAPS;
|
|
|
|
public:
|
|
/** @brief Per-host request allowance (requests/second) when no developer cap applies. */
|
|
static constexpr int DEFAULT_HOST_REQUEST_LIMIT = 10;
|
|
/** @brief Floor for any per-host request allowance. */
|
|
static constexpr int MIN_HOST_REQUEST_LIMIT = 1;
|
|
/**
|
|
* @brief Upper bound offered to the user when lowering an unlocked host's allowance.
|
|
*
|
|
* Unlocked hosts have no developer cap, so `clampHostRequestLimit` puts no upper bound on
|
|
* them; this only bounds what the settings dialog offers, and matches the widest paced
|
|
* allowance a user is documented to be able to hand-edit in `downloads.ini`. Choosing 0
|
|
* below this restores the "unlimited" fast path.
|
|
*/
|
|
static constexpr int UNLOCKED_HOST_LIMIT_MAX = 50;
|
|
/** @brief Developer cap marking a host as never throttled per host or by the dispatch pacing. */
|
|
static constexpr int UNLIMITED_HOST_QUOTA = -1;
|
|
|
|
/**
|
|
* @brief Developer-set per-host allowance ceilings (requests/second), keyed by host.
|
|
*
|
|
* Hosts not present default to DEFAULT_HOST_REQUEST_LIMIT. An entry of
|
|
* UNLIMITED_HOST_QUOTA marks a host that users may still lower, but that is never
|
|
* throttled per host by default. Users can never raise a host's allowance above its
|
|
* developer cap.
|
|
*/
|
|
static const QHash<QString, int> &getDeveloperHostCaps();
|
|
|
|
explicit DownloadSettings(const QString &, QObject *);
|
|
|
|
QStringList getAllURLs() const;
|
|
void setDownloadUrls(const QStringList &downloadURLs);
|
|
void resetToDefaultURLs();
|
|
[[nodiscard]] bool addLocalizedScryfallUrl();
|
|
[[nodiscard]] bool getPicDownload() const;
|
|
void setPicDownload(bool _picDownload);
|
|
[[nodiscard]] bool getDownloadSpoilersStatus() const;
|
|
void setDownloadSpoilerStatus(bool _spoilerStatus);
|
|
|
|
/** @brief User-set per-host request allowances (requests/second). Missing hosts use the developer default. */
|
|
QHash<QString, int> getHostRequestLimits() const;
|
|
void setHostRequestLimits(const QHash<QString, int> &hostRequestLimits);
|
|
|
|
/**
|
|
* @brief Clamps the user's requested allowance for a host against its developer cap.
|
|
* @param host The host to clamp for
|
|
* @param requested The user-requested allowance in requests/second
|
|
* @return The effective allowance. Users may lower a host's allowance but never raise it
|
|
* above the developer cap; hosts with UNLIMITED_HOST_QUOTA have no upper bound.
|
|
*/
|
|
[[nodiscard]] int clampHostRequestLimit(const QString &host, int requested) const;
|
|
|
|
signals:
|
|
void picDownloadChanged();
|
|
void downloadSpoilerStatusChanged();
|
|
void hostRequestLimitsChanged();
|
|
};
|
|
|
|
#endif // COCKATRICE_DOWNLOADSETTINGS_H
|