HTTP 102 Processing

HTTP 102 Processing is an interim status code defined in the WebDAV specification (RFC 2518) that tells the client the server has accepted the complete request but has not yet completed it. This prevents the client from timing out while the server performs a lengthy operation. Unlike 100 Continue which is about the request body, 102 Processing signals that the server is actively working on a fully received request that takes more than a few seconds to complete.

Debug HTTP 102 live
Analyze real 102 behavior — headers, caching, CORS, redirects
Open Inspector →

Try it (live endpoint)

Response includes the status code, standard headers (including Content-Type), and a small diagnostic JSON body describing the request and returned status.

Simulator URL (copy in the app after load — not a normal link):

https://httpstatus.com/api/status/102

Example request:

curl -i "https://httpstatus.com/api/status/102"
Try in playground

Meaning

The server has received and is processing the request, but no response is available yet. Used in WebDAV to prevent client timeouts on long operations.

What it guarantees
  • An interim response was provided before the final response.
What it does NOT guarantee
  • The request has succeeded or failed.
  • Clients should treat this as a final outcome.

When to use this status

  • Use only when it accurately describes the outcome for clients and tooling.

When NOT to use this status (common misuses)

Critical headers that matter

Tool interpretation

Browsers
Treats as success; caches/revalidates based on headers and validators.
API clients
Deserializes per Content-Type; conditional requests use validators when implemented.
Crawlers / SEO tools
Indexes depending on headers and canonical stability; caches behavior via validators and cache directives.
Uptime monitors
Typically marks success; advanced checks may flag header anomalies or latency.
CDNs / reverse proxies
Caches/revalidates based on Cache-Control, ETag, and Vary; compression and content-type affect behavior.

Inspector preview (read-only)

On this code, Inspector focuses on semantics, headers, and correctness warnings that commonly affect clients and caches.

Signals it will highlight
  • Status semantics vs method and body expectations
  • Header sanity (Content-Type, Cache-Control, Vary) and evidence completeness
Correctness warnings
No common correctness warnings are specific to this code.

Guided Lab outcome

  • Reproduce HTTP 102 Processing using a controlled endpoint and capture the full exchange.
  • Practice distinguishing status semantics from transport issues (redirects, caching, proxies).

Technical deep dive

102 Processing originated in WebDAV (RFC 2518) for operations like COPY or MOVE on large directory trees that could take minutes. The server periodically sends 102 responses as keep-alive signals. Crucially, this is NOT standard in HTTP/1.1 core — it's a WebDAV extension. The 102 response has no body and no required headers beyond the status line. Servers should send 102 at intervals (e.g., every 10-30 seconds) to prevent client/proxy timeouts. In HTTP/2, the PING frame serves a similar keep-alive purpose, making 102 less necessary. Note: RFC 4918 (the updated WebDAV spec) removed the 102 status code definition, making it effectively deprecated, though some implementations still use it.

Real-world examples

WebDAV bulk file operations
A cloud storage service using WebDAV receives a MOVE request to relocate a folder containing 10,000 files. The server sends 102 Processing every 15 seconds while traversing the directory tree, preventing the client from assuming the connection is dead.
Long-running report generation
An analytics API receives a request to generate a complex report spanning millions of rows. Instead of immediately returning 202 Accepted with a poll URL, the server holds the connection and sends 102 Processing periodically until the report is ready, then sends 200 with the result.
Batch import processing
A data migration endpoint accepts a large CSV upload and processes rows synchronously. During the 30-second processing window, it sends 102 to keep the HTTP connection alive and signal progress to the client and any intermediate proxies.

Framework behavior

Express.js (Node)
Express can send 102 via res.writeContinue() or manually: res.writeProcessing() (Node.js 10.0+). This sends an HTTP/1.1 102 Processing interim response without ending the response stream. The final response is sent normally with res.status(200).json(result).
Django / DRF (Python)
Django's WSGI interface doesn't natively support interim responses. To send 102, you'd need to operate at a lower level — using an ASGI server with raw response sending, or using a custom WSGI middleware that writes directly to the output stream before the Django response.
Spring Boot (Java)
Spring MVC doesn't have built-in 102 support. You can achieve it with DeferredResult or StreamingResponseBody, but for true interim responses, use the raw HttpServletResponse: response.setStatus(102); response.flushBuffer(); // then later send the final response.
FastAPI (Python)
FastAPI/Starlette doesn't natively support interim 102 responses. For long operations, prefer returning 202 Accepted with a status polling endpoint. If you need 102, use raw ASGI response sending before the final response.

Debugging guide

  1. Check if your HTTP client library supports interim (1xx) responses — many ignore them silently
  2. Verify proxies aren't buffering or dropping 102 responses — nginx proxy_buffering and proxy_read_timeout settings matter
  3. Monitor connection timeout settings on all hops: client → proxy → server — 102 keeps connections alive across all three
  4. If clients time out despite 102, the proxy might be absorbing the interim response — test with a direct connection
  5. Test with curl -v to see if 102 responses appear in verbose output (older curl versions may not display them)

Code snippets

Node.js
const http = require('http');

const server = http.createServer(async (req, res) => {
  if (req.url === '/long-task') {
    // Send 102 Processing to prevent timeout
    res.writeProcessing();

    // Simulate long operation
    const result = await performLongTask();

    // Send another 102 if still processing
    res.writeProcessing();

    await finalizeTask(result);

    // Final response
    res.writeHead(200, { 'Content-Type': 'application/json' });
    res.end(JSON.stringify({ status: 'complete', result }));
  }
});
Python
# Using raw ASGI for 102 support
async def app(scope, receive, send):
    if scope['type'] == 'http':
        # Send 102 interim response
        await send({
            'type': 'http.response.start',
            'status': 102,
            'headers': [],
        })
        # Perform long operation
        result = await long_running_task()
        # Send final response
        await send({
            'type': 'http.response.start',
            'status': 200,
            'headers': [[b'content-type', b'application/json']],
        })
        await send({
            'type': 'http.response.body',
            'body': json.dumps(result).encode(),
        })
Java (Spring)
// Spring Boot - raw servlet response for 102
@PostMapping("/long-task")
public void longTask(HttpServletRequest req,
                     HttpServletResponse res) throws Exception {
    // Send 102 Processing interim response
    res.setStatus(102);
    res.flushBuffer();

    // Perform long-running operation
    Result result = heavyComputation();

    // Send final 200 response
    res.setStatus(200);
    res.setContentType("application/json");
    res.getWriter().write(objectMapper.writeValueAsString(result));
}
Go
func longTaskHandler(w http.ResponseWriter, r *http.Request) {
	// Access the underlying connection for interim response
	flusher, ok := w.(http.Flusher)
	if !ok {
		http.Error(w, "Streaming not supported", 500)
		return
	}

	// Send 102 Processing (Go doesn't have native 1xx support,
	// so use 202 Accepted pattern instead)
	w.Header().Set("Content-Type", "application/json")
	w.WriteHeader(http.StatusAccepted)
	flusher.Flush()

	// For true 102, use a reverse proxy or custom conn handler
	result := performLongTask()
	json.NewEncoder(w).Encode(result)
}

FAQ

Is HTTP 102 Processing still part of the HTTP standard?
102 was originally defined in RFC 2518 (WebDAV). However, RFC 4918, which obsoleted RFC 2518, removed the 102 status code definition. It's effectively deprecated from the WebDAV spec. IANA still lists it, but new implementations should prefer 202 Accepted with polling or Server-Sent Events for long-running operations.
What is the difference between 102 Processing and 202 Accepted?
102 Processing is an interim response — the connection stays open and the server will eventually send a final response (like 200) on the same connection. 202 Accepted is a final response — the server closes the HTTP exchange and the client must poll a separate endpoint to check progress. 102 is synchronous waiting; 202 is asynchronous.
Do browsers handle 102 Processing responses?
Most browsers ignore 102 responses in their fetch/XHR implementations. The browser's HTTP stack may process them internally for connection keep-alive purposes, but they're not exposed to JavaScript. The Fetch API specification doesn't define behavior for 1xx responses beyond 101.
When should I use 102 Processing vs. streaming responses?
Use streaming (chunked transfer encoding or SSE) when you have incremental data to send. Use 102 when you have no data yet but need to prevent timeouts. In practice, 202 + polling or WebSocket/SSE are preferred over 102 because they work reliably through proxies and load balancers.

Client expectation contract

Client can assume
    Client must NOT assume
    No common correctness warnings are specific to this code.
    Retry behavior
    Retries are generally unnecessary; treat as final unless domain rules require revalidation.
    Monitoring classification
    Server error
    Use payload and header checks to avoid false positives; cacheability depends on Cache-Control/ETag/Vary.

    Related status codes

    101 Switching Protocols
    The server is switching protocols as requested by the client via the Upgrade header (e.g., upgrading to WebSocket).
    103 Early Hints
    Used to return preliminary response headers (typically Link headers for preloading resources) before the final HTTP response.

    Explore more

    Related guides
    Related tools
    Related utilities