Stop Mocking Everything: How to Test API Resilience in Your Terminal (Curl + Chaos Proxy)
Source: Dev.to
Introduction
“It works on my machine.”
We’ve all said it. But does your bash script work when the third‑party API takes 15 seconds to respond? Does your backend service gracefully handle a sudden spike of 503 errors from a payment provider?
Writing a full mock server just to test a simple retry logic in a script is often overkill. In this tutorial, I’ll show you a faster way: Chaos Engineering directly in the terminal.
We will use curl and a cloud‑based Chaos Proxy to inject failures into real network requests without changing a single line of your application code.
The Problem: Localhost is Too Perfect
When developing locally, network latency is near zero. APIs either work (200 OK) or they don’t (Connection Refused). But in production, you face:
- High Latency – the server is busy.
- Intermittent Failures – 5 % of requests drop.
- Throttling – you hit the rate limit.
Simulating this in a terminal usually involves complex iptables rules or local tools like tc (Traffic Control). There is an easier way.
The Solution: Cloud Chaos Proxy
Instead of configuring your OS, we will route specific requests through a proxy that breaks the traffic according to rules we define.
I’ll be using chaos‑proxy.debuggo.app for this, but the concept applies to any programmable proxy.
Video Guide (1:27)
Prefer watching? Here is the 90‑second workflow.
Step‑by‑Step Tutorial
1. Define the Failure
Tell the proxy what to break.
- Target:
httpbin.org(or your API domain). - Delay:
7 seconds(simulate lag). - Failure Rate:
1(100 % of requests will fail). - Error Code:
503 Service Unavailable.
2. Trust the Certificate (The “One‑Time” Setup)
Since we are intercepting HTTPS traffic, we need to trust the proxy’s CA certificate.
- Download
mitmproxy-ca-cert.pemfrom the dashboard. - macOS – Add it to Keychain Access → System and set Always Trust.
- Linux – Copy it to
/usr/local/share/ca-certificates/and runupdate-ca-certificates.
3. The Magic Command
Use curl with the -x (proxy) flag:
curl -v -x http://user:pass@chaos-proxy.debuggo.app:13979 https://httpbin.org/get
Understanding the Output
When you run the command multiple times you’ll see two possible scenarios.
Scenario A – The Chaos (Delay + Failure)
The terminal hangs for ~7 seconds, then returns:
< HTTP/1.1 500 Internal Server Error
< content-length: 56
< content-type: text/plain
...
Debuggo Chaos Injection: 500 Error
Scenario B – Success
About half the time the request passes through to the real server:
< HTTP/1.1 200 OK
...
{
"args": {},
"headers": { ... }
}
Real‑World Use Cases
- Testing CI Pipelines – Verify that deployment scripts don’t crash if a dependency is slow.
- Cron Jobs – Ensure nightly data syncs retry correctly on failure.
- Quick Sanity Checks – Before pushing code, confirm how the API client handles a 503 error.
Conclusion
You don’t need heavy infrastructure to test network resilience. A simple proxy setup allows you to inject chaos into any HTTP client—be it curl, wget, or your Python/Node.js scripts.
Happy breaking! 🔨