{ }HttpStatus.com

100 Continue

Interim response telling the client it may continue sending the request body after the server has accepted the initial headers.

Defined in RFC 9110 §15.2.1

What 100 means

HTTP 100 Continue is an interim response defined for the Expect: 100-continue negotiation. A client that plans to send a large or conditional request body first transmits only the request line and headers, including the Expect header, then pauses. The server inspects the headers alone, method, authentication, content length, path, and decides whether the request is likely to succeed before the body arrives. If it is, the server replies 100 Continue and the client proceeds to stream the body; if the server can already tell the request will fail, it returns the final status directly and the client can skip the upload.

This handshake exists to avoid wasting bandwidth and time on uploads that are doomed to be rejected, most commonly large file uploads, PUT requests with sizable payloads, or POST bodies gated by authentication. Command line tools like curl add the Expect header automatically once a body crosses roughly one kilobyte, and many HTTP client libraries do the same. Because the 100 response carries no body and is not the final answer, clients must keep reading until a genuine final status line arrives; well behaved HTTP/1.1 stacks handle this transparently, but naive raw socket implementations sometimes stall waiting for a response that never comes.

Servers that do not understand or support the mechanism are expected to ignore an unrecognized Expect header and respond as normal, though HTTP/1.1 technically permits returning 417 Expectation Failed instead. Reverse proxies and load balancers occasionally interfere by buffering the whole request before forwarding it, which defeats the purpose but rarely breaks correctness. In HTTP/2 and HTTP/3 the same interim exchange is carried as a separate informational HEADERS frame rather than a distinct message, so the semantics survive even though the wire format changes. Clients should always cap how long they wait for the interim reply.

Common causes

  • The client sent a request with an Expect: 100-continue header and a request body, typically for a large file upload or PUT.
  • The server has finished reading the request headers and determined the request can proceed without inspecting the body.
  • A REST client library or SDK adds the Expect header automatically for bodies above a size threshold.
  • An HTTP/2 or HTTP/3 client uses the equivalent informational response before the terminal HEADERS frame that carries the real status.
  • A proxy or load balancer in the path forwards the 100 Continue from the origin without modification.

How to fix a 100

If you are the client (browser user or API caller)

  • Send the Expect: 100-continue header before the body only when you actually want to wait for server approval, and set a reasonable timeout in case the interim reply never arrives.
  • Treat 100 as non-final: keep reading from the connection until the real status line and headers appear.
  • If a proxy strips or mishandles Expect headers, fall back to sending the body immediately without waiting.
  • Use an HTTP client library that already implements the 100-continue state machine rather than hand-rolling raw socket code.

If you run the server

  • Validate headers, authentication, and Content-Length as soon as they arrive and reply with the final error status immediately when the request cannot succeed, instead of always sending 100.
  • Make sure any reverse proxy or load balancer in front of the app passes 100 Continue through rather than buffering the entire request first.
  • Configure the web server or framework to emit 100 Continue promptly so clients are not left waiting near their timeout.
  • Support Expect header handling correctly in HTTP/1.1 rather than defaulting to 417 Expectation Failed for every request.

Example

PUT /uploads/large-file.zip HTTP/1.1
Host: api.example.com
Content-Length: 104857600
Expect: 100-continue

HTTP/1.1 100 Continue

[client now streams the 100 MB request body]

HTTP/1.1 201 Created
Location: /uploads/large-file.zip
Client waits for 100 Continue before uploading a large file.

Try it live

Our free status responder returns a real HTTP 100 you can point tests, monitors or a browser at.

GET https://mcp.httpstatus.com/status/100

Related status codes

Tools for debugging this