Skip to content
Control Plane Labs

205 Reset Content

Success response defined by RFC 9110 §15.3.6.

Last updated July 27, 2026

Common causes at a glance

  • A legacy data entry application asking the browser to clear a form
  • A framework mapping a create-and-continue action onto 205
  • An API author picking 205 because the phrase sounded right for a clear operation
  • A server erroneously attaching a body to a 205, breaking connection framing

Reproduce it

curl -i -X POST -d 'field=value' https://forms.example.com/entry

What 205 Reset Content means

205 was designed for one workflow: a data entry clerk filling in the same form repeatedly. Submit a record, the fields blank themselves, type the next one. The status is an instruction to the user agent about its own UI, nearly unique among status codes.

No mainstream browser has ever implemented that reset. A form posted to an endpoint returning 205 does not clear itself, and since the response cannot contain a body there is nothing to render either. In a single-page app the client owns form state directly and does not need the server to ask, which removes the last reason to use it.

What the spec says

RFC 9110 §15.3.6 defines 205 and states that a server MUST NOT generate content in a 205 response. That MUST NOT is the practical trap: earlier HTTP drafts went back and forth on how a 205 should be framed, and some servers still emit a Content-Length greater than zero or a chunked body, a violation that confuses HTTP/1.1 keep-alive handling. The spec says nothing about how the user agent should perform the reset, part of why nobody implemented it consistently.

What actually causes it

In practice 205 shows up in two places: very old form-driven intranet applications, and code where someone picked the status by name. The second bites. An endpoint returning 205 to a fetch caller gives the JavaScript nothing to work with, because the body must be empty and no browser performs the reset. If the intent is “the write worked and there is nothing to say”, 204 is the code every client handles. If it is “here is the fresh state”, return 200. The genuinely broken case is a server emitting 205 with a body: some HTTP/1.1 stacks read the leftover bytes as the start of the next response on a keep-alive connection, corrupting an unrelated request.

How to debug it

The only thing worth checking is framing. Confirm the response has zero content and that the connection survives a second request on it:

curl -sv -o /dev/null -X POST -d 'field=value' https://forms.example.com/entry \
https://forms.example.com/entry 2>&1 | grep -iE '^(< HTTP|< content-|\* Re-using)'

Passing the URL twice reuses the connection, so a botched 205 surfaces as a parse error or unexpected close on the second request rather than the first. A content-length above zero means the server violates the MUST NOT; fix that first. Beyond framing there is nothing to debug. No browser reacts to the code, so if the expected behaviour is a cleared form the reset belongs on the client.

Working examples

curl

# Check that the 205 is framed correctly and does not poison keep-alive.
curl -sv -o /dev/null \
  -X POST -d 'field=value' \
  https://forms.example.com/entry https://forms.example.com/entry 2>&1 \
  | grep -iE '^(< HTTP|< content-length|\* Re-using|\* Connection)'

# A compliant 205 shows no content-length above zero and reuses the connection.

Python (requests)

import requests

s = requests.Session()  # keep-alive, so framing bugs surface on the second call
resp = s.post("https://forms.example.com/entry", data={"field": "value"}, timeout=10)

print(resp.status_code, len(resp.content))  # 205 0
if resp.status_code == 205 and resp.content:
    print("spec violation: 205 MUST NOT carry content")

# Second request over the same connection - a bad 205 breaks here, not above.
print(s.get("https://forms.example.com/entry", timeout=10).status_code)

Node (fetch)

const res = await fetch("https://forms.example.com/entry", {
  method: "POST",
  body: new URLSearchParams({ field: "value" }),
});

console.log(res.status, res.ok); // 205 true
const text = await res.text();
if (text.length) console.warn("205 returned a body; this violates RFC 9110");

// No browser clears the form for you. Do it yourself and return 204 server-side.
if (res.status === 205) document.querySelector("form")?.reset();

Reference and tooling

The authoritative list of assigned status codes is theIANA HTTP Status Code Registry. For a searchable copy with the semantics summarised, use theHTTP status code reference on this site. To see exactly what a server is sending, theheader inspector shows the raw status line and response headers, and thecurl builder assembles the request flags for you.

Other 2xx codes