Using QUIC Stream Resets with Partial Delivery in HTTP/3
draft-seemann-httpbis-reset-stream-at-00
This document is an Internet-Draft (I-D).
Anyone may submit an I-D to the IETF.
This I-D is not endorsed by the IETF and has no formal standing in the
IETF standards process.
| Document | Type | Active Internet-Draft (individual) | |
|---|---|---|---|
| Author | Marten Seemann | ||
| Last updated | 2026-06-29 | ||
| RFC stream | (None) | ||
| Intended RFC status | (None) | ||
| Formats | |||
| Stream | Stream state | (No stream defined) | |
| Consensus boilerplate | Unknown | ||
| RFC Editor Note | (None) | ||
| IESG | IESG state | I-D Exists | |
| Telechat date | (None) | ||
| Responsible AD | (None) | ||
| Send notices to | (None) |
draft-seemann-httpbis-reset-stream-at-00
HTTP M. Seemann
Internet-Draft 29 June 2026
Intended status: Informational
Expires: 31 December 2026
Using QUIC Stream Resets with Partial Delivery in HTTP/3
draft-seemann-httpbis-reset-stream-at-00
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/.
Seemann Expires 31 December 2026 [Page 1]
Internet-Draft Reliable QUIC Stream Resets in HTTP/3 June 2026
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.
Copyright Notice
Copyright (c) 2026 IETF Trust and the persons identified as the
document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents (https://trustee.ietf.org/
license-info) in effect on the date of publication of this document.
Please review these documents carefully, as they describe your rights
and restrictions with respect to this document. Code Components
extracted from this document must include Revised BSD License text as
described in Section 4.e of the Trust Legal Provisions and are
provided without warranty as described in the Revised BSD License.
Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2
2. Conventions and Definitions . . . . . . . . . . . . . . . . . 3
3. Use Cases . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3.1. CONNECT Tunnels . . . . . . . . . . . . . . . . . . . . . 3
3.2. Intermediaries After Response Commitment . . . . . . . . 4
3.3. Malformed Decoded HTTP Messages . . . . . . . . . . . . . 4
3.4. Requests Rejected Before Application Processing . . . . . 4
4. Security Considerations . . . . . . . . . . . . . . . . . . . 5
5. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 5
6. References . . . . . . . . . . . . . . . . . . . . . . . . . 5
6.1. Normative References . . . . . . . . . . . . . . . . . . 5
6.2. Informative References . . . . . . . . . . . . . . . . . 5
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 6
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 6
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.
Seemann Expires 31 December 2026 [Page 2]
Internet-Draft Reliable QUIC Stream Resets in HTTP/3 June 2026
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.
Seemann Expires 31 December 2026 [Page 3]
Internet-Draft Reliable QUIC Stream Resets in HTTP/3 June 2026
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.
Seemann Expires 31 December 2026 [Page 4]
Internet-Draft Reliable QUIC Stream Resets in HTTP/3 June 2026
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,
June 2022, <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, 26 June 2026,
<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, March 1997,
<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,
May 2017, <https://www.rfc-editor.org/rfc/rfc8174>.
6.2. Informative References
Seemann Expires 31 December 2026 [Page 5]
Internet-Draft Reliable QUIC Stream Resets in HTTP/3 June 2026
[WEBTRANS-HTTP3]
Frindell, A., Kinnear, E., and V. Vasiliev, "WebTransport
over HTTP/3", Work in Progress, Internet-Draft, draft-
ietf-webtrans-http3-15, 2 March 2026,
<https://datatracker.ietf.org/doc/html/draft-ietf-
webtrans-http3-15>.
Acknowledgments
TODO acknowledge.
Author's Address
Marten Seemann
Email: martenseemann@gmail.com
Seemann Expires 31 December 2026 [Page 6]