online / endpoints 59 / categories 14 / rate 60/min/ip /

GET /rss

GET /rss

Returns RSS 2.0 feeds with spec violations. Default omits the required channel title. Use ?mode= to isolate other violations: wrong date format, non-URL guid marked as permalink, or enclosure MIME type lie.

mode Which violation to send. One of: missing-channel-title (default; required channel <title> absent), item-pubdate-wrong-format (<pubDate> uses ISO 8601 instead of required RFC 822), guid-not-permalink (<guid isPermaLink="true"> is a plain string not a URL), enclosure-type-lie (<enclosure type="audio/mpeg"> pointing at an HTML page).
build a request:

expect: An RSS 2.0 document served as application/rss+xml with one of four spec violations. X-Chaos-Rss-Note explains what is wrong.

bash
curl -si 'https://chaos.catastrophic.io/rss?mode=missing-channel-title' | grep -E '^(HTTP|content-type|x-chaos-rss)'
# Default mode (missing-channel-title) drops  from <channel>.
# RSS 2.0 §2.3.1 lists it as required. Aggregators using channel.title
# for the feed display name render "undefined" or throw.
import urllib.request
from xml.etree import ElementTree as ET

resp = urllib.request.urlopen("<span data-url-target>https://chaos.catastrophic.io/rss?mode=missing-channel-title</span>")
print("Content-Type:", resp.headers.get("Content-Type"))
print("X-Chaos-Rss-Mode:", resp.headers.get("X-Chaos-Rss-Mode"))
root = ET.fromstring(resp.read())
channel = root.find("channel")
print("channel found:", channel is not None)
if channel is not None:
    title = channel.find("title")
    print("channel title present:", title is not None)
    print("channel children:", [c.tag for c in channel])
</code></pre></div>
      
    
      
      
        
          
        
        
        
        
          
        
        <div class="code-tabs__panel" data-panel="javascript" data-lang-label="javascript"><pre><code>const res = await fetch("<span data-url-target>https://chaos.catastrophic.io/rss?mode=missing-channel-title</span>");
console.log("Mode:", res.headers.get("X-Chaos-Rss-Mode"));
const raw = await res.text();
const doc = new DOMParser().parseFromString(raw, "application/xml");
const channel = doc.querySelector("channel");
console.log("channel found:", !!channel);
console.log("channel title present:", !!channel?.querySelector("title"));
</code></pre></div>
      
    
      
      
        
          
        
        
        
        
          
        
        <div class="code-tabs__panel" data-panel="go" data-lang-label="go"><pre><code>package main

import (
    "encoding/xml"
    "fmt"
    "io"
    "net/http"
)

type Rss struct {
    Channel struct {
        Title string `xml:"title"`
        Items []struct {
            Title string `xml:"title"`
        } `xml:"item"`
    } `xml:"channel"`
}

func main() {
    resp, _ := http.Get("<span data-url-target>https://chaos.catastrophic.io/rss?mode=missing-channel-title</span>")
    defer resp.Body.Close()
    raw, _ := io.ReadAll(resp.Body)
    fmt.Println("Mode:", resp.Header.Get("X-Chaos-Rss-Mode"))
    var feed Rss
    xml.Unmarshal(raw, &feed)
    fmt.Println("channel title:", feed.Channel.Title)
    fmt.Println("channel title empty:", feed.Channel.Title == "")
    fmt.Println("items:", len(feed.Channel.Items))
}
</code></pre></div>
      
    
      
      
        
          
        
        
        
        
          
        
        <div class="code-tabs__panel" data-panel="rust" data-lang-label="rust"><pre><code>// Cargo.toml: reqwest = { version = "0.12", features = ["blocking"] }
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let resp = reqwest::blocking::get("<span data-url-target>https://chaos.catastrophic.io/rss?mode=missing-channel-title</span>")?;
    println!("Mode: {:?}", resp.headers().get("x-chaos-rss-mode"));
    let body = resp.text()?;
    // Quick check: does <channel> contain a <title>?
    let channel_start = body.find("<channel>").unwrap_or(0);
    let channel_block = &body[channel_start..body.find("</channel>").unwrap_or(body.len())];
    println!("channel has <title>: {}", channel_block.contains("<title>"));
    Ok(())
}
</code></pre></div>
      
    
      
      
        
          
        
        
        
        
          
        
        <div class="code-tabs__panel" data-panel="java" data-lang-label="java"><pre><code>import java.net.URI;
import java.net.http.*;

public class RssChaos {
    public static void main(String[] args) throws Exception {
        var client = HttpClient.newHttpClient();
        var req = HttpRequest.newBuilder(URI.create("<span data-url-target>https://chaos.catastrophic.io/rss?mode=missing-channel-title</span>")).build();
        var resp = client.send(req, HttpResponse.BodyHandlers.ofString());
        System.out.println("Content-Type: " + resp.headers().firstValue("Content-Type").orElse(""));
        System.out.println("X-Chaos-Rss-Mode: " + resp.headers().firstValue("X-Chaos-Rss-Mode").orElse(""));
        System.out.println("Body: " + resp.body());
    }
}
</code></pre></div>
      
    
      
      
        
          
        
        
        
        
          
        
        <div class="code-tabs__panel" data-panel="csharp" data-lang-label="C#"><pre><code>using var client = new HttpClient();
var resp = await client.GetAsync("<span data-url-target>https://chaos.catastrophic.io/rss?mode=missing-channel-title</span>");
Console.WriteLine($"Content-Type: {resp.Content.Headers.ContentType}");
Console.WriteLine($"X-Chaos-Rss-Mode: {resp.Headers.GetValues("X-Chaos-Rss-Mode").FirstOrDefault()}");
var body = await resp.Content.ReadAsStringAsync();
Console.WriteLine($"Body: {body}");
</code></pre></div>
      
    
      
      
        
          
        
        
        
        
          
        
        <div class="code-tabs__panel" data-panel="ruby" data-lang-label="ruby"><pre><code>require "net/http"
require "rexml/document"
uri = URI("<span data-url-target>https://chaos.catastrophic.io/rss?mode=missing-channel-title</span>")
Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
    res = http.get(uri.request_uri)
    puts "Content-Type: #{res['Content-Type']}"
    puts "X-Chaos-Rss-Mode: #{res['X-Chaos-Rss-Mode']}"
    doc = REXML::Document.new(res.body)
    channel = doc.elements["rss/channel"]
    puts "channel found: #{!channel.nil?}"
    puts "channel title present: #{!channel.elements["title"].nil?}" if channel
end
</code></pre></div>
      
    
      
      
        
          
        
        
        
        
          
        
        <div class="code-tabs__panel" data-panel="powershell" data-lang-label="powershell"><pre><code>$r = Invoke-WebRequest -Uri '<span data-url-target>https://chaos.catastrophic.io/rss?mode=missing-channel-title</span>'
"Content-Type: $($r.Headers['Content-Type'])"
"X-Chaos-Rss-Mode: $($r.Headers['X-Chaos-Rss-Mode'])"
$xml = [xml]$r.Content
$channel = $xml.rss.channel
"channel found: $($null -ne $channel)"
"channel title present: $($null -ne $channel.title)"
</code></pre></div>
      
    
  </div>

  
    <div class="response" data-response hidden>
      <div class="response__bar">
        <span class="response__title">live response</span>
        <span class="response__status" data-response-status>—</span>
        <span class="response__time" data-response-time></span>
        <button type="button" class="response__close" data-response-close aria-label="Hide response">close</button>
      </div>
      <div class="response__section">
        <div class="response__section-label">headers</div>
        <pre class="response__headers"><code data-response-headers></code></pre>
      </div>
      <div class="response__section">
        <div class="response__section-label">body</div>
        <pre class="response__body"><code data-response-body></code></pre>
      </div>
    </div>
  

  
  
</section>


  
</article>

  </main>
  
<footer class="site-footer">
  <div class="site-footer__inner">
    <div>
      
        <p class="site-footer__motto">endpoints that <em>misbehave</em> on purpose.</p>
      
      <p>no request bodies, headers, or query parameters are logged or retained.</p>
    </div>
    <div class="site-footer__links">
      <div class="site-footer__links-row">
        
          <a href="/about/">about</a>
          <a href="/catalog/">catalog</a>
          <a href="/compare/">compare</a>
          <a href="/docs/">docs</a>
          <a href="/playground/">playground</a>
          
            <a href="/openapi.yaml">spec</a>
          
        
      </div>
      <div class="site-footer__links-row site-footer__links-row--legal">
        <a href="/tools/">tools</a>
        <a href="/terms/">terms</a>
        <a href="/privacy/">privacy</a>
        <a href="/see-also/">see also</a>
      </div>
    </div>
  </div>
</footer>

  <script src="/js/app.js" type="module"></script>
  <script src="/js/glitch.js" defer></script>
  
  <script defer src="https://static.cloudflareinsights.com/beacon.min.js"
          data-cf-beacon='{"token": "83c3241c893b41cf902e4510d8f0105f"}'></script>
</body>
</html>