[PictureLoader] Make dispatch and rate-limit bookkeeping key on the real host

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.
This commit is contained in:
Lukas Brübach 2026-09-20 22:52:43 +02:00
parent 8a16b43a90
commit 3bd118fae9
4 changed files with 75 additions and 13 deletions

View file

@ -25,6 +25,15 @@ public:
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;