So many feed readers, so many behaviors
rachelbythebay.com
rachelbythebay.com
This kind of attitude reeks of the "you're using it wrong!" of the Linux world. Are you really telling me you are getting enough RSS feed requests to put a dent on your tech stack? Is your bandwidth overhead suffering that much (are you not caching?)? Make it painless and let's be thankful it isn't all web scrapers masquerading as users.
Mind-boggling problem to be angry about.
When I looked in the logs I could see that they hit the API with a lot of requests in short succession that generated 403 responses, so we said that they need to look at how they authorise. After a while they returned and claimed our API was broken. Eventually I offered to look at their code and they were like 'yeah sure but your silly little PHP dev won't understand our perfect C# application'.
So I looked at it and it was a mess of auto-concurrent, nested, for-loops. If they had gotten any data out it would have been an explosion of tens of thousands of requests within a few seconds. They also didn't understand the Bearer-scheme and just threw the string they got from the auth-endpoint straight into the Authorization-header without any prefix. Maybe we should have answered with 400 instead of 403, but yeah, that would have been a breaking change and we didn't want or have time to do a new API version because of this.
Anyway, their tech-manager got really mad that I found the issue within an hour that they had struggled with for months, and also had mentioned that the API-adapter was designed for DoS rather than a polite API-consumer and maybe they should rewrite it to be less greedy and maybe also use ranges instead of crapping out a new request per row in in a response and stitching it together again on their end.
A few weeks later they got it running and it was brutal, but our machines could take the load so we didn't think more about it. Later I heard they got performance issues on their end and had to do as I had suggested anyway.
Be polite and pay attention to detail when you integrate with protocols and API:s. At best you'll be a nuisance if you don't, but many will just block you permanently.
I'm a simple person, I often prefer the succinct, crude analogy over telling a story until asked or provoked into telling one.
Do you think regular REST API calls to any other service are any different?
- Know Your HTTP Well: https://github.com/for-GET/know-your-http-well
- HTTP Decision Diagram: https://github.com/for-GET/http-decision-diagram
Making it painless is letting readers use the options available, supporting the commonly used standards and maybe fixing small problems (I'd probably space trim that URL for example). It doesn't mean supporting systems that are sending poorly formed or badly controlled requests, regardless of the impact it has on your tech stack.
Both RSS feed providers and reader maintainers believe that RSS isn't dead, it's just pining for the fjords.
They've got to keep their readers efficient ready for RSS to rise again - much like Christians have to resist the temptation of sin ready for the second coming of Christ.
/s
Badly behaved RSS readers that download feeds uncached are wasting orders of magnitude more of bandwidth and CPU (gotta encrypt it for HTTPS) on my end than well-behaved clients that get served 304s. Some of them don't even set "Accept-Encoding: gzip" and download it uncompressed. That's hundreds of kilobytes per request wasted for nothing.
My blog doesn't see enough traffic to make this an issue for me, but I can see why this could be a real problem for popular blogs with loads of traffic.
A determined attacker might be able to get in despite all of these precautions, but it's at least administered in a somewhat responsible manner. I highly doubt most servers exposed on the internet are.
Right tools for the job. It's not a failing to use a cache.
I'm saying it's better for both you and your users to keep network traffic at a proper CDN than a home ISP network. It'll be faster for everyone.
still better than giving up to cloudflare
Can you explain what you mean by this? I don't understand what you're saying (it seems obviously incorrect?)
cache only works on https for extra assets. which is useless if you have a simple static site anyway
Went to https://example.com, checked that it's cached in the inspector, clicked on the More information link which leads to https://www.iana.org/domains/example, unplugged my connection (went offline), clicked back. It showed the cached https://example.com. I clicked forward. It showed the cached https://www.iana.org/domains/example page. Clicked back/forward like a maniac, the pages switched seamlessly.
Repeated the same process on a non-cacheable page, it showed a dud when disconnected as expected.
Tested on Firefox and Chromium.
Pray tell, what would be the good alternative, for this «niche of people» who collect the news? We use RSS because news are collected through RSS.
And clients have to be properly, wisely configured: some publish monthly some much more than hourly; some are a feed per domain, others are thousands of feeds per domain... This constitutes a set-up problem.
Why should "wide adoption" be relevant? We are already very well informed (much too well informed) that "people" are """odd""". What are your assumptions?
If you need to drive a screw, and few people used screwdrivers - who cares? You'd still use screwdrivers even when people tried to use cakes or monkeys or simply stopped driving screws, would you not?
You already expect "people" to use cakes or monkeys for something when they would normally be expected to drive screws - actually, you expect to be surprised with much worse ideas becoming realities. So?
Screwdrivers remain relevant, and using them properly remains equally relevant. And especially so, when you note that people are there with loose parts stuck together because the cake smudged monkey was not precise!
~~ Isaac Asimov
> An odd interpretation of "democracy" is lurking according to which we should look at masses to take example, instead of warning
~~ mdp2021
It's static content, at least as static as the rest of your content, so write once and let one of a dozen CDNs cache it for you for free. They will do a good job of setting cache headers for you. If people want to ignore them and honk on it from their crappy readers, that's on them.
Even if you're personally serving it from your kitchen toaster, it's static content. You need a significant number of bad actors for this to be a problem.
Moreover, if this post is anything to go by, treating a bad reader with a logical hurdle and expecting a sane result is baffling.
It's not worth this much headspace.
In practice, my SSG generates my RSS at the same time as my website and it's all running under Cloudflare Pages so it's just deployed and I don't have to think about any of it past the git commit.
I think that's what I'm trying to get at here. If you're dynamically generating RSS for a dynamic blog today, you've made some significant design errors.
Building and caching my blog can be done well and freely by a dozen services, and it can easily fall back to me on my server if all else fails.
If we were talking about edge functions and proprietary integrations, that might be a more significant issue, but static websites are insanely easy to push off to CDN services.
I'm not advocating Cloudflare because they're doing something special, it's because they're doing something utterly menial, for free and better than any one person or small company could.
It's absolutely right be be cognisant of service dependencies but none exist here. They're just making a dull job easier.
I'd be tempted to go the opposite direction and give it articles that seem new, every time, called "Your feed reader is very broken and you should use a different one".
That way, badly-behaved clients can't use their broken RSS to receive actual articles until they fix it and they get to know why exactly.
So the request pattern basically looks like:
1. Get 304.
2. Wait 5min.
3. Get 429.
4. Error backoff evenly distributed between 30-60min
5. Go back to step 1.
So I guess 5min is "too fast" even for conditional requests. However the reason my reader picks 5min is:
1. There is no caching headers to suggest the author's preference.
2. Conditional requests are supported.
3. The feed is fast.
4. The feed is popular.
5. The feed is active (posts every week or so)
Sure, for her feed it could probably be lower but how is a robot supposed to know that? I would highly recommend setting a cache header. That gives an automatic signal of when the last fetch should be considered stale. I'll admit that many feed readers just use a fixed schedule, but many will still use a library that accidentally caches requests (maybe the browser extension readers that she was complaining about would?). For my feed reader we won't poll more often than your cache header (Cache-Control or Expires will both work) unless it is more than 24h in which case we will poll no more frequently than daily. If you just post blog posts about it it is never going to change, it is better to start pushing for broader support of an actual protocol that could be implemented.
Another great option is supporting WebSub. It is easy to get set up with a public hub and then readers that support it will poll very rarely. (Mine will poll weekly.)
That file is served over HTTPS, so every response must be encrypted individually. If it's cached by the client, that's a 304 and a couple hundred bytes of response headers to encrypt. If it's not, that's a 200 and a couple hundred thousand bytes to encrypt.
Now imagine if a garbage reader doesn't cache the feed and requests the full file every time, like Tiny Tiny RSS tends to do in my access logs. Multiply that by the number of subscribers using these busted readers. Multiply that by the number of requests they do each day.
That's a whole lot of load on the server's CPU wasted for nothing.
The server also has to process the useful requests on top of that.
People are absolutely still using RSS, the tech is very much not dead.
If the issue is the processing power because the content served is dynamically generated, cache the content. Even with a server running on ESP32, just a few second should be enough (if the rest of the website to be statically generated)
If the issue is the bandwidth you may focus on big content (i.e. media) and return a 429 or use a CDN just for that (not worth for a feed in my opinion)
If the issue is neither, why bother ? Your time is precious, and you should spend it on more enjoyable things (that is, unless you find doing this enjoyable of course).
I tried using a few RSS feeds from major news organizations (WaPo, NYT). All I get are the headlines and a link to the article. I am not sure if it has always been this way or not.
On the other hand, “rachelbythebay” blog posts can be viewed entirely in the RSS reader.
I am using “feedly” on iOS. Downside I see is that it does not properly display all of the formatting elements. Some examples:
- Bullets represented as just *.
- The “code” sections sort of sit awkwardly in the reader. No formatting applied.
- ~~In some of the code sections, it’s just awkwardly replaced by ellipses (…)~~ nvm, this is the authors writing style :)
Maybe that’s just a specific RSS reader issue?
Some feed readers have "scraping" support where they request each article's URL internally and figure out how (or can be configured with CSS selectors) to extract the article's text content and display it in the reader, though it can be pretty hit or miss whether that can work for a given site.
As for formatting, there are a couple possible explanations--the reader could be ignoring or mangling HTML tags in the content when it's displaying it, or the site itself may be generating its RSS feeds with mangled or missing formatting elements. In my experience both possibilities are equally likely.
Still here in Vivaldi.
This objection might make more sense if the purpose of a feed reader was to do nothing except check rachelbythebay.com for updates.
There are surely a lot of badly behaved clients out there and I sympathize with that, but the author's policies seem rather heavy handed and counterproductive to providing an open feed. God forbid their most dedicated readers receive the most timely updates.
Given the update frequency and kind of content it does not seem much of an issue does it?
> the author's policies seem rather heavy handed and counterproductive to providing an open feed
It’s not though? “Open feed” is just that, it’s not a license to be a resource hog because you refuse to be a good citizen.
> God forbid their most dedicated readers receive the most timely updates.
Rachel does not post day to day life updates. “Most timely updates” is not a thing, it’s not a storm reporting feed. Latency is not a concern.
You are free to not serve such requests, but as a blogger you might want to consider that such bot traffic serves your legitimate readers. It appears to me that the author is also rate limiting well behaved clients that are already trying to be respectful of resources using conditional requests.
Why install a lecture in the feed reader? Just have a banner/toast/status-bar-message/whatever that says "This feed will update in X minutes/hours/days.".
If you're going to show that message, why are you a feed reader at all? Open the webpage and show the content.
GP seemed fixated on showing a lecture, which I thought was strictly worse than just showing a short message.
> If you're going to show that message, why are you a feed reader at all?
What? The feed readers I used showed status messages. Status messages are nice, they give the operator a fighting chance to understand what's going on and fix things if they've gone wrong.
Which resources are you "hogging" by reloading a webpage twice?
My guess: No `Cache-Control` response header.
checks
Yup, no `Cache-Control` response header. So she doesn't want more than one request per day, but also doesn't want to add this header to the responses:
Cache-Control: public, max-age=86400, stale-if-error=86400I think it's both parties' responsibility. Well, "responsibility" may be a strong word, but it depends what you want to achieve.
It's okay to return 429 if you receive more than one request per day. But if the goal is to not get those requests in the first place, you can make it way easier with that Cache-Control header.
A client might not support the Retry-After header; after all, it's not widely supported by web browsers, so I can see how some libraries might not even bother with adding that maintenance burden.
But Cache-Control is more widely supported, so it's more likely to be already implemented in client libraries (or even caching proxies).
If someone doesn't support Retry-After, and also ignores Cache-Control, by all means, return an error. It's probably a misconfiguration of their client library at best, or a broken client at worst.
I'm not saying one should bend backwards and put unrealistic effort into stuff like this; what I'm saying is, if the HTTP 429 thingy was an acceptable amount of effort, then the Cache-Control thing should be similar (actually way less) effort and time and should slightly reduce the amount of requests received.
It can certainly guess, based on that retry-after header, that she doesn't post more than once a day, and should respect that.
If I have 500 feeds in my reader, most of whom update weekly at most, I would assume the reader does something smarter that mindlessly launch 500 requests every 5 minutes.
Aside from respecting any 429 headers, what is a reader supposed to do without custom update heuristics for each feed that would be considered more than mindless?
Looking at my access logs, some RSS readers are well-behaved and get served 304s. Some of them however not only request feed.xml without caching, but they don't even set the HTTP header "Accept-Encoding: gzip". They download feed.xml every time and they download it uncompressed.
I'm hosting my blog on a feeble 5-year old Synology NAS located in my apartment. It's not seeing a lot of traffic so it's currently not a problem, but these RSS readers are wasting several orders of magnitude more of network bandwidth and CPU resources (gotta encrypt it for HTTPS) on my end than well-behaved RSS readers.
It's just plain embarrassing.
I would highly recommend she sets `Cache-Control: max-age=3600` or something similar. That is at least a method that can automatically be applied. Sure, right now most readers just use fixed intervals, but further support for this is a standard that can be pushed slowly. Plus some readers probably use HTTP libraries that would automatically cache the response so some clients will accidentally have support.
I use only RSS. That is how I obtain new information. I do not know personally anyone else doing that. I ping sources every hour, but I ping at least 400 sources.
From my sources none provided last-modified in headers: reddit, youtube, personal sites (In ff f12, network). My site supports it. It is nice also that you support it, but I doubt there is any impact of that in real world. Most of the attention goes through tiktok,youtube videos, through chrome browser. Either it is supported now, or it doesn't really matter if 40 dudes makes request every minute or so.
We should also provide clean title, description, in open graph protocol meta data, and yet not everybody does that.
We should also return correct HTTP status codes, and yet not everybody does that.
I am disenchanted with current state of the Internet, or maybe it was always a little bit pile of various things/garbage.
Web crawling core is in file: https://github.com/rumca-js/Django-link-archive/blob/main/rs...
Some things more project specific are in https://github.com/rumca-js/Django-link-archive/blob/main/rs...
I know that there already are spiders, metadata processing packages for python, but I like having control over the process.
Old man yelling at the cloud. I hate also:
- blocking me with 403 because my user agent is not "mainstream". Why do I have to use chrome undetected to read some RSS feeds? Why can't I use third party clients? Contents can have adverts. I just want my own layout, buttons
- RSS feeds protected with cloudflare, so tools cannot read feeds easily
- not using, or outright blocking RSS functionality in wordpress. Some sites could be more open that way, but no. RSS feeds are closed/removed
- some sites have "/blog" location, but the main domain is empty, or nearly empty, or returns 404. Can I trust such location?
- when HTML meta data are not available. I like YouTube. It allows me to scrape metadata, but it protects video contents, and that is good
- weird redirects. Domain does not have any contents. Does not describe what it is. It just have javascript redirects. From main domain to some weird locations within the domain
- url shorteners, vanity links. You do not know where you will be transported. I understand they are counting sheep, but they sacrifice my security
- google returning links with syntax "https://www.google.com/url", not directly. Youtube does the same with syntax "https://www.youtube.com/redirect". For me again this is vulnerability
My ethic web scraper results are placed in: https://github.com/rumca-js/Internet-Places-Database.
I just added her feed to a third party proxy service. If the owner of the site doesn’t want to serve a very small and basically static text file in a way people expect then that is their prerogative.
But having to run their feed through a proxy to work around this doesn’t seem to be something they would like to encourage.
I'm an old programmer and sysadmin. Programmers and sysadmins are definitely the "target audience" for this blog.
I expect that if I request a resource on the web, and I get back a 429 with a "Retry-After" then:
- I WILL NOT get a new version of that resource until after that time has elapsed
- I MAY get banned for an unknowable-by-me period of time if I continue to attempt to request that resource, despite getting a 429.
The reality is that it’s not much effort to serve a small bit of plaintext data, and nobody really cares that much to even notice.
It’s unclear if the effort is worth it, for anything other than what amounts to “well ackchully the spec says I can do it so I’ll do it” pedantry.