Skip to content

[Bug] 1.27: Domain-wide Retry-After on 503/429 blocks all feeds on the same host (RSSHub use-case). Please add per-feed scope or a toggle #7870

@WestXu

Description

@WestXu

Describe the bug

Summary

After upgrading to 1.27, FreshRSS appears to apply Retry-After at the domain/host level. When one feed on a host returns 503 or 429 (often a single shaky RSSHub route), all feeds on that same host (ip address) are delayed until the retry time.

This hurts setups where a single host (e.g., RSSHub) serves many independent routes. I also run other RSS parsers on the same internal host, so one bad route effectively stalls the whole system.

Logs (example)

⚠️ 2025-08-29 22:15:03 For that domain, will first retry after 2025-08-29T22:40:03+08:00. http://172.17.0.1:2888/?view=rss&subreddit=Quest&averagePostsPerDay=2
⚠️ 2025-08-29 22:15:03 For that domain, will first retry after 2025-08-29T22:40:03+08:00. http://172.17.0.1:21200/v2ex/topics/hot
⚠️ 2025-08-29 22:15:03 HTTP 503 Service Unavailable! [http://172.17.0.1:21200/eagle/changelog]
⚠️ 2025-08-29 21:00:54 For that domain, will first retry after 2025-08-29T21:25:02+08:00. http://172.17.0.1:21200/ithome/hot

Expected behavior

  • Retry-After should be per-feed by default (only the failing URL is delayed), or
  • Provide a configuration toggle to choose the scope: feed vs domain.
    • e.g. fetch.retry_after_scope = feed | domain (default can remain domain for compatibility).

Actual behavior

  • A single 503/429 on http://172.17.0.1:21200/... causes FreshRSS to defer all feeds on 172.17.0.1:xxxx until the same “retry after” time, even though other routes on that host are healthy.

Why this matters

  • Aggregators like RSSHub multiplex many unrelated upstreams behind one host. One shaky route (or upstream rate-limit) should not block all other routes.
  • Some self-hosters (like me) also run other parsers on the same internal host/port. Domain-wide backoff stalls everything.

Regression?

  • On 1.26.x this did not happen (no domain-wide delay). On 1.27.x it does.

Suggested solutions (any would help)

  • Config flag to control scope: per-feed (per-URL) vs domain (current behavior).
  • Alternative policy: treat 429 as domain-wide, but treat 5xx (esp. 503) as per-feed by default.

Workarounds considered

  • Sharding across multiple hostnames / reverse proxy: not possible in my environment.
  • Caching/stale-on-error at proxy: also not available here.
  • Downgrading to 1.26.3 works, but I’d prefer staying on 1.27.x.

Environment

  • FreshRSS: 1.27.x (Docker)
  • OS: Linux (Docker)
  • Feeds: RSSHub on the same machine, accessed via http://172.17.0.1:21200/...
  • Network: FreshRSS container curls the host IP directly (no reverse proxy)

Thanks

A scope toggle or a per-feed policy for Retry-After would preserve 1.27’s good intent (being nice to servers) while avoiding whole-host stalls in aggregator setups.

To Reproduce

  1. Run FreshRSS 1.27.x in Docker.
  2. Add multiple feeds that share the same host (e.g., several RSSHub routes all at https://rsshub.app/...).
  3. Make one route return 503 (or 429, with/without Retry-After), eg. https://rsshub.app/eagle/changelog
  4. Observe FreshRSS logs: “For that domain, will first retry after …”, and note that all feeds on that host are delayed.

Expected behavior

No response

FreshRSS version

1.27.0

System information

FreshRSS version
1.27.0
PHP version
8.4.11
cURL version
8.14.1
OpenSSL/3.5.2
Database
sqlite
3.49.2
Server software
nginx/1.28.0
Linux 5.4.0-48-generic #52-Ubuntu SMP Thu Sep 10 10:58:49 UTC 2020 x86_64
Browser
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0

Additional context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    Bug (unconfirmed)issues that could not be reproduced yetRSS standardthe standard is defined f.e. on https://www.rssboard.org

    Type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions