Internet-Draft Reliable QUIC Stream Resets in HTTP/3 June 2026
Seemann Expires 31 December 2026 [Page]
Workgroup:
HTTP
Internet-Draft:
draft-seemann-httpbis-reset-stream-at-00
Published:
Intended Status:
Informational
Expires:
Author:
M. Seemann

Using QUIC Stream Resets with Partial Delivery in HTTP/3

Abstract

QUIC stream resets do not guarantee delivery of stream data sent before the reset. This is a problem for HTTP/3 when the correct protocol outcome is an abrupt stream termination, but the sender still has a bounded prefix worth delivering, such as response headers, a short diagnostic response body, or a partial response received from an upstream host.

RESET_STREAM_AT provides reliable delivery of that prefix and is already used by WebTransport over HTTP/3 when resetting streams. The same mechanism also fits HTTP/3 CONNECT tunnels, intermediary failures after response commitment, malformed decoded HTTP messages, and requests rejected before application processing.

Discussion Venues

This note is to be removed before publishing as an RFC.

Discussion of this document takes place on the HTTP Working Group mailing list (ietf-http-wg@w3.org), which is archived at https://lists.w3.org/Archives/Public/ietf-http-wg/.

Source for this draft and an issue tracker can be found at https://github.com/marten-seemann/draft-seemann-httpbis-reset-stream-at.

Status of This Memo

This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.

Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.

Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."

This Internet-Draft will expire on 31 December 2026.

Table of Contents

1. Introduction

HTTP/3 [HTTP3] uses QUIC streams to carry requests and responses. Several HTTP/3 errors are signaled by abruptly terminating a stream with an error code, but a QUIC stream reset does not ensure delivery of data sent before the reset.

This matters when the sender has a useful bounded prefix, but the correct HTTP/3 outcome is still a stream error. Examples include a proxy that has received response bytes before an upstream failure, or a server that has decoded a malformed request and wants to send a short diagnostic response before using H3_MESSAGE_ERROR.

RESET_STREAM_AT [RESET-STREAM-AT] adds a Reliable Size to the reset, so stream data up to that point is delivered reliably while the stream still terminates abruptly. WebTransport over HTTP/3 [WEBTRANS-HTTP3] already uses this extension to ensure delivery of the prefix that associates a WebTransport stream with its session.

The following sections describe HTTP/3 cases where reliable prefix delivery is useful while retaining the existing stream-error signal.

2. Conventions and Definitions

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.

3. Use Cases

3.1. CONNECT Tunnels

The relay use case described in [RESET-STREAM-AT] directly applies to HTTP/3 CONNECT. HTTP/3 CONNECT carries tunnel data in DATA frames after a successful CONNECT response. [HTTP3] says that TCP connection errors, including TCP reset, are signaled as stream errors of type H3_CONNECT_ERROR.

A proxy might receive bytes from the upstream TCP connection and then observe an upstream reset. With a plain stream reset, DATA frames containing those upstream bytes might be lost and will not be retransmitted. Using RESET_STREAM_AT allows the proxy to signal H3_CONNECT_ERROR while still delivering the upstream bytes that it has committed to forwarding.

For this use case, the Reliable Size SHOULD be the end of the last committed DATA frame carrying tunnel bytes from the upstream connection.

3.2. Intermediaries After Response Commitment

An intermediary can translate an upstream failure into a new HTTP response only before it sends response headers downstream. After that, it cannot replace the response with a new status code.

If the intermediary later detects an upstream stream error, a malformed upstream response, or another stream-local failure, RESET_STREAM_AT allows it to terminate the stream with an appropriate HTTP/3 error code while making reliable only the response portion it can safely identify. That portion always includes the committed response HEADERS frame, and can include later response data when the intermediary understands enough of the application protocol to choose a useful boundary. The Reliable Size SHOULD therefore be the end of the response HEADERS frame, or the end of a later complete HTTP/3 frame forwarded downstream.

This is mainly useful for diagnostics, logging, and clients that can consume a partial streaming response before an error.

3.3. Malformed Decoded HTTP Messages

This use case applies after an HTTP/3 HEADERS frame has been parsed and QPACK decompression has succeeded. It does not apply to invalid HTTP/3 frame syntax, invalid frame ordering, or QPACK decompression failure. Examples of malformed HTTP messages under [HTTP3] include invalid pseudo-header fields and uppercase field names. A detected malformed message is treated as a stream error of type H3_MESSAGE_ERROR.

RESET_STREAM_AT allows a diagnostic HTTP response to be delivered while preserving the H3_MESSAGE_ERROR signal. The Reliable Size SHOULD be the end of the diagnostic response HEADERS frame, or the end of a later complete DATA frame carrying a short diagnostic response body.

The additional information can be valuable when debugging faulty or non-conforming clients.

3.4. Requests Rejected Before Application Processing

[HTTP3] defines H3_REQUEST_REJECTED for requests that a server rejects without performing application processing. A client can treat such a request as though it had never been sent. H3_REQUEST_REJECTED is not used after partial or full application processing.

A server might want to preserve this retry signal while also providing a small diagnostic response. For example, a server that is draining, overloaded, or unable to route a request might send a 503 or 429 response with retry information, then terminate the stream with H3_REQUEST_REJECTED.

With RESET_STREAM_AT, the Reliable Size SHOULD be the end of the diagnostic response HEADERS frame, or the end of a later complete DATA frame carrying a short diagnostic response body. This is mainly useful for HTTP/3-aware clients and debugging tools. A generic HTTP client API might not expose both the HTTP response and the stream error.

4. Security Considerations

TODO Security

5. IANA Considerations

This document has no IANA actions.

6. References

6.1. Normative References

[HTTP3]
Bishop, M., Ed., "HTTP/3", RFC 9114, DOI 10.17487/RFC9114, , <https://www.rfc-editor.org/rfc/rfc9114>.
[RESET-STREAM-AT]
Seemann, M. and K. Oku, "QUIC Stream Resets with Partial Delivery", Work in Progress, Internet-Draft, draft-ietf-quic-reliable-stream-reset-08, , <https://datatracker.ietf.org/doc/html/draft-ietf-quic-reliable-stream-reset-08>.
[RFC2119]
Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/rfc/rfc2119>.
[RFC8174]
Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, , <https://www.rfc-editor.org/rfc/rfc8174>.

6.2. Informative References

[WEBTRANS-HTTP3]
Frindell, A., Kinnear, E., and V. Vasiliev, "WebTransport over HTTP/3", Work in Progress, Internet-Draft, draft-ietf-webtrans-http3-15, , <https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-http3-15>.

Acknowledgments

TODO acknowledge.

Author's Address

Marten Seemann