> ## Content Index
> Fetch the complete content index at: https://debugly.dev/llms.txt
> Use this file to discover other available public pages before exploring further.

# The curl Command That Reproduced the Bug in Four Seconds
- URL: https://debugly.dev/curl-command-reproduced-the-bug/
- Published: 2026-10-09T15:37:00.000Z
- Updated: 2026-10-17T05:56:02.000Z
- Description: The report was a screenshot and a guess, and the reproduction was one command with the right headers, and the command turned an hour of speculation into a…
- Author: Rohit Bhadani
- Tags: Tooling, Debugging, HTTP

I have chased this from the fix end and from the bug report end, and the truth was in the hand-off, as it usually is.

Strip the reproduction down and one property makes it the fastest path: the command removes the client, the network and the guesswork, and leaves the request and the response, and the two are the whole conversation, and the conversation is the diagnosis.

The case was a REST API returning a 400; the mechanics generalise to any HTTP service.

## Why the screenshot was not enough

The screenshot was the browser, and the browser was the client, and the client was the variables, and the variables were the cache and the extension and the cookie and the version, and the four were the unknown, and the unknown was the guess, and the guess was the hour, because the hour was the elimination, and the elimination was the try this, and the try this was the slow, and the slow was the speculation.

The screenshot showed the symptom, and the symptom was the 400, and the 400 was the response, and the response was the server's, and the server's was the request's answer, and the answer was the request's problem, and the request was the invisible in the screenshot, and the invisible was the gap, and the gap was the hour, and the hour is the reason the reproduction beats the description.

The description is the lossy, and the lossy is the human's summary, and the summary is the omission, and the omission is the header, and the header was the bug, and the bug was the omitted, and the omitted was the hour, and the hour is the cost of the description over the reproduction.

## The breakthrough

The breakthrough was the HAR file, and the HAR was the browser's recording, and the recording was the request, and the request was the copy as cURL, and the copy was the command, and the command was the four seconds, and the four seconds was the same 400, and the same was the reproduction, and the reproduction was the isolation, and the isolation was the removal, and the removal was the client, and the client was the gone, and the gone was the request and the response alone.

The diff was the next step, and the diff was the comparison, and the comparison was the working request, and the working was the other endpoint, and the other was the similar, and the similar was the difference, and the difference was the header, and the header was the content type, and the content type was the missing charset, and the missing was the parse, and the parse was the 400, and the 400 was the fix, and the fix was the header.

The four seconds was the reproduction, and the reproduction was the hour's replacement, and the replacement was the tooling, and the tooling was the copy as cURL, and the copy was the one click, and the click was the discipline, and the discipline is the reason the reproduction comes before the code reading.

This is the same principle as [the HAR file as the flight recorder](https://debugly.dev/har-file-flight-recorder/), same mechanism, different costume.

## How to build the habit

**Copy as cURL from the browser.** The developer tools give the exact request, and the exact is the headers and the body and the cookies, and the three are the reproduction, and the reproduction is the four seconds, and the four seconds is the fix's start, and the start is the click.

**Strip until it fails, then add until it works.** The minimal request is the isolation, and the isolation is the variable, and the variable is the cause, and the cause is the fix, and the fix is the binary search, and the search is the method, and the method is the faster than the reading, because the request is the truth and the code is the guess.

**Keep the failing command in the ticket.** The command is the reproduction, and the reproduction is the next person's start, and the start is the saved hour, and the hour is the value, and the value is the discipline, and the discipline is the ticket's requirement, because the ticket without the reproduction is the ticket that takes an hour.

**Turn the command into a test.** The curl is the request, and the request is the assertion, and the assertion is the regression guard, and the guard is the prevention, and the prevention is the fix, and the fix is the test, and the test is the command's second life, and the life is the value.

**Check the response body, not only the status.** The body is the reason, and the reason is the error's detail, and the detail is the diagnosis, and the diagnosis is the fix, and the fix is the reading, and the reading is the one line, and the line is the answer, because the 400 alone is the symptom and the body is the cause.

## The takeaway

A screenshot is a lossy description and a reproduction is the exact request, so the reproduction comes first. Copy as cURL from the browser, strip to the minimal failing request, keep the command in the ticket, turn it into a test, and read the response body rather than only the status.

The report was a screenshot of a 400 and the fix took an hour of reading code, until someone copied the request as curl and reproduced it in four seconds, then diffed it against a working request and found a missing charset in the content type header. Get that property wrong and every layer above it lies to you politely.

---

Published on [debugly.dev](https://debugly.dev/) by [Rohit Bhadani](https://debugly.dev/about/) | Founder of [Krova Cloud](https://krova.cloud/?ref=debugly.dev)