What is an HTTP 1xx interim response, and how does an exchange that includes 100 Continue or 103 Early Hints differ from an ordinary request/response pair?
answer
- interim = not final, another response follows
- 1xx never has a body
- Expect: 100-continue → hold the body
- curl's 1-second continue timer
- 103 Early Hints = preload before the page
basics
~20 sA 1xx is a non-final response: status line plus headers, never a body, and a final response still follows on the same exchange. 100 Continue tells a client waiting with Expect: 100-continue to send its request body; 103 Early Hints sends preload links before the real response.
solid answer
~50 sNormally one request yields one final response. A **1xx** breaks that one-to-one shape: it is an interim response — status line and header fields, never content — and the client must keep reading until a final (2xx–5xx) response arrives. **100 Continue** pairs with the client sending `Expect: 100-continue` and withholding the body. The server can inspect method, URL, auth and `Content-Length` and either say `100 Continue` or reject with a final status such as 401 or 413 — saving a large upload from crossing the network. Clients bound the wait with a short timer and send anyway on timeout, because intermediaries sometimes swallow the interim. **103 Early Hints** is sent before the final response carrying `Link: rel=preload` headers, so a browser starts fetching subresources while the origin is still computing the page. General rule: clients must be able to receive and ignore unknown 1xx codes. In HTTP/2 and HTTP/3 an interim is just a HEADERS frame without END_STREAM.
code
http · 13 linesPUT /uploads/report.bin HTTP/1.1
Host: api.example.com
Content-Length: 52428800
Expect: 100-continue
(client waits, body not sent yet)
HTTP/1.1 100 Continue
(client now streams the 50 MB body)
HTTP/1.1 201 Created
Location: /uploads/report.bingo deeper
Know that 1xx means 'not finished yet, a real response is still coming' and that it has no body.
Explain the Expect: 100-continue handshake and what 103 Early Hints buys page loads, including that clients must ignore unknown 1xx codes.
Bring the operational failures: proxies swallowing the interim causing fixed upload stalls, and gating 103 to modern connections because old intermediaries mishandle it.
Discuss where interim responses pay off at scale — rejecting huge uploads before they cross the network, and shaving critical-path latency at the edge — versus the compatibility surface they add.
## Interim vs final HTTP's basic shape is one request, one response. The 1xx class is the exception: an interim response consists of the status line and an optional set of header fields, is **always** terminated by the end of the header section, and **never** carries content. It does not complete the exchange — the server will still send a final response with a 2xx–5xx code. A client that stops reading after a 1xx has mis-parsed the exchange. Because any server may send an interim at any time, RFC 9110 requires clients to be able to parse and simply ignore 1xx codes they do not recognize. That is what makes the class extensible. ## 100 Continue The expectation mechanism exists so a client does not waste bandwidth uploading a body the server will refuse. The client sends the request head with `Expect: 100-continue` and pauses instead of streaming the body. The server, which now knows the method, target, credentials and declared `Content-Length`, either replies `100 Continue` — meaning "headers accepted, send the body" — or short-circuits with a final response such as 401 Unauthorized, 403, 413 Content Too Large or 417 Expectation Failed. The practical hazard is waiting forever. Some servers and proxies never emit the interim, so clients arm a short timer (curl uses one second) and send the body anyway when it expires. That is why an upload through a badly behaved proxy shows a fixed one-second stall per request — a classic latency mystery. Servers, symmetrically, must not require the expectation from clients that did not offer it. ## 101, 102, 103 - **101 Switching Protocols** answers an `Upgrade` request and marks the point where the connection stops speaking HTTP/1.1 and starts speaking something else, typically WebSocket. It is formally 1xx but ends HTTP semantics on that connection. HTTP/2 has no 101 at all; protocol switching there uses extended CONNECT. - **102 Processing** was a WebDAV keep-alive hint for long operations and is now deprecated — it never solved the timeout problem it was invented for. - **103 Early Hints** is the modern reason the class matters. The origin, before it knows the final status, sends `103` with `Link: </app.css>; rel=preload; as=style` headers. The browser begins fetching those assets while the server is still querying databases, recovering hundreds of milliseconds of critical-path time. Multiple 103s may be sent, and the hints are advisory: the final response still governs. Because some old intermediaries mishandled unexpected interims, deployments usually gate 103 on HTTPS/h2 connections. ## Versions In HTTP/1.1 an interim is literally an extra status line and header block on the wire before the real one, which is why buggy parsers concatenate them. In HTTP/2 and HTTP/3 interims are ordinary HEADERS frames whose `:status` is 1xx and which do not set END_STREAM, so the multiplexed framing layer handles them cleanly and there is no ambiguity about where the final response begins. ## When it shows up in practice Large uploads and API gateways (100), WebSocket handshakes (101), and page-load performance work at the CDN edge (103). Debugging tools hide interims by default — `curl -v` shows the `< HTTP/1.1 100 Continue` line, browser devtools generally do not — so engineers often meet 1xx first as a stall or an unexplained duplicate header block in a proxy log.
- A client sends Expect: 100-continue and the server never answers. What should the client do?It must not wait indefinitely. After a short timeout it sends the body anyway and continues to handle whatever final response arrives. This tolerates intermediaries that strip or ignore the expectation, at the cost of a fixed stall per request — which is why clients that talk to such proxies usually disable the expectation entirely.
- Why can a 1xx never carry a body?Because message framing must stay unambiguous: the interim ends at the end of its header section, and any bytes after it belong to the next response on that connection. Allowing content would make it impossible for a recipient to tell interim payload from the final response, which is exactly the desynchronization that enables response smuggling.
saying these in an interview costs you the question
- Treating a 1xx as the final response and closing the exchange
- Believing 100 Continue is negotiated automatically without the client sending Expect
- Claiming 103 Early Hints replaces the real response rather than preceding it
- Saying 1xx responses may carry a small body
- Expecting 101 Switching Protocols to work over HTTP/2