online / endpoints 62 / categories 10 / rate 60/min/ip /

GET /toml

GET /toml alias: /toml

Returns a well-formed TOML 1.0 document: top-level scalars, sub-table, arrays of tables, RFC 3339 datetime, homogeneous arrays. Served as application/toml. Counterpart to /toml, which ships one of seven TOML 1.0 violations.

expect: 200 OK with Content-Type: application/toml. Spec-compliant TOML 1.0 with no parser-adversity patterns. Build TOML config loaders against this, then flip hostname to chaos.catastrophic.io to test adversity.

bash
curl -si 'https://not.catastrophic.io/toml'
# Python 3.11+ ships tomllib in the stdlib.
import urllib.request, tomllib
resp = urllib.request.urlopen("https://not.catastrophic.io/toml")
print("Content-Type:", resp.headers.get("Content-Type"))
print("X-Chaos-Toml-Mode:", resp.headers.get("X-Chaos-Toml-Mode"))
print("X-Chaos-Toml-Note:", resp.headers.get("X-Chaos-Toml-Note"))
raw = resp.read()
try:
    parsed = tomllib.loads(raw.decode())
    print("parsed OK, top-level keys:", list(parsed.keys()))
except tomllib.TOMLDecodeError as e:
    print("tomllib rejected:", e)
// npm: @iarna/toml or smol-toml. Example uses smol-toml.
import { parse } from "smol-toml";
const res = await fetch("https://not.catastrophic.io/toml");
console.log("Content-Type:", res.headers.get("content-type"));
console.log("X-Chaos-Toml-Mode:", res.headers.get("x-chaos-toml-mode"));
console.log("X-Chaos-Toml-Note:", res.headers.get("x-chaos-toml-note"));
const text = await res.text();
try {
  console.log("parsed:", parse(text));
} catch (e) {
  console.log("parser rejected:", e.message);
}
package main

// go get github.com/BurntSushi/toml
import (
    "fmt"
    "io"
    "net/http"

    "github.com/BurntSushi/toml"
)

func main() {
    resp, _ := http.Get("https://not.catastrophic.io/toml")
    defer resp.Body.Close()
    raw, _ := io.ReadAll(resp.Body)
    fmt.Println("Content-Type:", resp.Header.Get("Content-Type"))
    fmt.Println("X-Chaos-Toml-Mode:", resp.Header.Get("X-Chaos-Toml-Mode"))
    var out map[string]any
    if _, err := toml.Decode(string(raw), &out); err != nil {
        fmt.Println("decoder rejected:", err)
    } else {
        fmt.Println("decoded keys:", out)
    }
}
// Cargo.toml: reqwest = { version = "0.12", features = ["blocking"] }
//            toml = "0.8"
fn main() -> Result<(), Box> {
    let resp = reqwest::blocking::get("https://not.catastrophic.io/toml")?;
    println!("Content-Type: {:?}", resp.headers().get("content-type"));
    println!("X-Chaos-Toml-Mode: {:?}", resp.headers().get("x-chaos-toml-mode"));
    let text = resp.text()?;
    match toml::from_str::(&text) {
        Ok(v) => println!("parsed: {:?}", v),
        Err(e) => println!("parser rejected: {}", e),
    }
    Ok(())
}
// Add to build.gradle: implementation("org.tomlj:tomlj:1.1.1")
import java.net.URI;
import java.net.http.*;
import org.tomlj.Toml;
import org.tomlj.TomlParseResult;

public class TomlChaos {
    public static void main(String[] args) throws Exception {
        var client = HttpClient.newHttpClient();
        var req = HttpRequest.newBuilder(URI.create("https://not.catastrophic.io/toml")).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-Toml-Mode: " +
            resp.headers().firstValue("X-Chaos-Toml-Mode").orElse(""));
        TomlParseResult r = Toml.parse(resp.body());
        if (r.hasErrors()) r.errors().forEach(e -> System.out.println("parse error: " + e));
        else System.out.println("keys: " + r.keySet());
    }
}
// NuGet: Tomlyn
using Tomlyn;
using var client = new HttpClient();
var resp = await client.GetAsync("https://not.catastrophic.io/toml");
Console.WriteLine($"Content-Type: {resp.Content.Headers.ContentType}");
Console.WriteLine($"X-Chaos-Toml-Mode: " +
    $"{resp.Headers.GetValues("X-Chaos-Toml-Mode").FirstOrDefault()}");
var text = await resp.Content.ReadAsStringAsync();
var (doc, diags) = (Toml.Parse(text), Toml.Parse(text).Diagnostics);
Console.WriteLine($"diagnostics: {diags.Count}");
foreach (var d in diags) Console.WriteLine($"  {d}");
# gem install toml-rb
require "net/http"
require "toml-rb"
uri = URI("https://not.catastrophic.io/toml")
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-Toml-Mode: #{res['X-Chaos-Toml-Mode']}"
    puts "X-Chaos-Toml-Note: #{res['X-Chaos-Toml-Note']}"
    begin
        parsed = TomlRB.parse(res.body)
        puts "parsed keys: #{parsed.keys.inspect}"
    rescue => e
        puts "parser rejected: #{e.message}"
    end
end
# PSToml (Install-Module PSToml) or just dump raw.
$r = Invoke-WebRequest -Uri 'https://not.catastrophic.io/toml'
"Content-Type: $($r.Headers['Content-Type'])"
"X-Chaos-Toml-Mode: $($r.Headers['X-Chaos-Toml-Mode'])"
"X-Chaos-Toml-Note: $($r.Headers['X-Chaos-Toml-Note'])"
$r.Content