{"id":31,"date":"2005-02-17T13:24:34","date_gmt":"2005-02-17T18:24:34","guid":{"rendered":"http:\/\/crschmidt.net\/blog\/?p=31"},"modified":"2005-02-17T13:24:34","modified_gmt":"2005-02-17T18:24:34","slug":"feedburner-feeds","status":"publish","type":"post","link":"https:\/\/crschmidt.net\/blog\/archives\/31\/feedburner-feeds\/","title":{"rendered":"Feedburner has Header Issues"},"content":{"rendered":"<p>So, recently I&#8217;ve been watching a little bit of a <a href=\"http:\/\/feedburner.com\">FeedBurner<\/a> problem arise between some friends on IRC, over at <a href=\"http:\/\/www.mobitopia.com\">Mobtiopia<\/a>. Seems that <a href=\"http:\/\/www.tarekesber.com\/\">MobileTech<\/a> uses Feedburner for his feed, via <a href=\"http:\/\/feeds.feedburner.com\/Mobiletech\">http:\/\/feeds.feedburner.com\/Mobiletech<\/a>.<\/p>\n<p>However, <a href=\"http:\/\/www.thauvin.net\/erik\/\">Erik<\/a> was having some problems, where every time the feed loaded, all items would look new. He dug into the problem a bit, and found what the root of the problem most likely is: Every 30 minutes or so, the &#8220;Last-Modified&#8221; header for Feedburner updates. It caches it per IP for about 30 minutes to an hour, it seems, but once you get past that, it just snaps back to the current time.<\/p>\n<p>Now, I&#8217;m not one to criticize over small mistakes like this, but I feel bad for Feedburner: Their conditional get mechanism is completely broken by this difference. Rather than returning a 304 not modified, Feedburner is returning the full feed every hour someone asks for it. That&#8217;s got to be quite a hit on their bandwidth.<\/p>\n<p>In this case, there were a couple other issues relating to the problem: Tarek&#8217;s feed was previously powered by RDF, which FeedBurner seemed to chew up and spit out in a quite ugly way in his case. However, I haven&#8217;t seen it happen the same way in other cases. In Tarek&#8217;s case, the feed was actually using what looked like uniquely generated local IDs for an rdf:about &#8211; which, although fine in RDF-parlance, is not allowed according to the RSS 1.0 specification, and doesn&#8217;t pass the feed validator. Most likely, Erik&#8217;s newsreader, <a href=\"http:\/\/www.newzcrawler.com\/\">newzcrawler<\/a>, saw these funky looking IDs and didn&#8217;t treat them as permalinks, contributing to the problem.<\/p>\n<p>Regardless of other issues though, I&#8217;ve checked a few other feedburner feeds, and every single one of them has a Last-Modified header in the past hour. This is simply not a good plan for your bandwidth, or for RSS in general: you&#8217;re dealing with a lot more traffic than you need to. 304 Not Modified is your friend, either via Etags or If-Modified-Since. RSS readers are doing good at cleaning up their act and using these headers &#8211; if the servers don&#8217;t support them, that&#8217;s just going to discourage such use in the future, and contribute to the load problem that RSS has become for so many people.<\/p>\n<p>I&#8217;m going to let Feedburner know about this in more detail, and this is really not a slight against them. Headers for HTTP\/RSS are hard to get right, not something that just &#8220;works&#8221; out of the box typically. So, I understand the difficulties attached to them. Getting them wrong, however, has some major consequences on all parties, so I hope they can figure out what&#8217;s up and get it fixed, both for their sake and for the sake of people that use them.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>So, recently I&#8217;ve been watching a little bit of a FeedBurner problem arise between some friends on IRC, over at Mobtiopia. Seems that MobileTech uses Feedburner for his feed, via http:\/\/feeds.feedburner.com\/Mobiletech. However, Erik was having some problems, where every time the feed loaded, all items would look new. He dug into the problem a bit, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-31","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/crschmidt.net\/blog\/wp-json\/wp\/v2\/posts\/31","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/crschmidt.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/crschmidt.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/crschmidt.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/crschmidt.net\/blog\/wp-json\/wp\/v2\/comments?post=31"}],"version-history":[{"count":0,"href":"https:\/\/crschmidt.net\/blog\/wp-json\/wp\/v2\/posts\/31\/revisions"}],"wp:attachment":[{"href":"https:\/\/crschmidt.net\/blog\/wp-json\/wp\/v2\/media?parent=31"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/crschmidt.net\/blog\/wp-json\/wp\/v2\/categories?post=31"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/crschmidt.net\/blog\/wp-json\/wp\/v2\/tags?post=31"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}