Skip to main content

8. Error Handling (错误处理)

当流无法成功完成时,QUIC允许应用程序突然终止(重置)该流并传达原因;参见 [QUIC-TRANSPORT] 的第2.4节。这被称为"流错误 (Stream Error)"。HTTP/3实现可以决定关闭QUIC流并传达错误类型。错误码的线路编码在第8.1节中定义。流错误与指示错误条件的HTTP状态码不同。流错误表示发送方没有传输或消费完整的请求或响应,而HTTP状态码表示成功接收的请求的结果。

如果需要终止整个连接,QUIC类似地提供了传达原因的机制;参见 [QUIC-TRANSPORT] 的第5.3节。这被称为"连接错误 (Connection Error)"。与流错误类似,HTTP/3实现可以终止QUIC连接并使用第8.1节中的错误码传达原因。

尽管关闭流和连接的原因被称为"错误",但这些操作并不一定表示连接或任一实现存在问题。例如,如果不再需要请求的资源,则可以重置流。

在某些情况下,端点可以 (MAY) 选择将流错误视为连接错误,响应单个流上的条件而关闭整个连接。在做出此选择之前,实现需要考虑对未完成请求的影响。

由于可以在不协商的情况下定义新的错误码(参见第9节),在意外上下文中使用错误码或接收未知错误码必须 (MUST) 被视为等同于H3_NO_ERROR。但是,关闭流可能会产生其他影响,而与错误码无关;例如,参见第4.1节。

8.1. HTTP/3 Error Codes (HTTP/3错误码)

以下错误码定义用于突然终止流、中止读取流或立即关闭HTTP/3连接时使用。

H3_NO_ERROR (0x0100)
无错误。当需要关闭连接或流但没有错误需要发出信号时使用。

H3_GENERAL_PROTOCOL_ERROR (0x0101)
对等方违反了协议要求,但不符合更具体的错误码,或端点拒绝使用更具体的错误码。

H3_INTERNAL_ERROR (0x0102)
HTTP堆栈中发生了内部错误。

H3_STREAM_CREATION_ERROR (0x0103)
端点检测到其对等方创建了一个它不会接受的流。

H3_CLOSED_CRITICAL_STREAM (0x0104)
HTTP/3连接所需的流被关闭或重置。

H3_FRAME_UNEXPECTED (0x0105)
接收到的帧在当前状态或当前流上不允许。

H3_FRAME_ERROR (0x0106)
接收到不满足布局要求或大小无效的帧。

H3_EXCESSIVE_LOAD (0x0107)
端点检测到其对等方表现出可能产生过多负载的行为。

H3_ID_ERROR (0x0108)
流ID或推送ID被不正确地使用,例如超出限制、减少限制或被重用。

H3_SETTINGS_ERROR (0x0109)
端点在SETTINGS帧的有效载荷中检测到错误。

H3_MISSING_SETTINGS (0x010a)
控制流开始时未接收到SETTINGS帧。

H3_REQUEST_REJECTED (0x010b)
服务器在不执行任何应用程序处理的情况下拒绝了请求。

H3_REQUEST_CANCELLED (0x010c)
请求或其响应(包括推送响应)被取消。

H3_REQUEST_INCOMPLETE (0x010d)
客户端的流终止时未包含完整形式的请求。

H3_MESSAGE_ERROR (0x010e)
HTTP消息格式错误且无法处理。

H3_CONNECT_ERROR (0x010f)
响应CONNECT请求建立的TCP连接被重置或异常关闭。

H3_VERSION_FALLBACK (0x0110)
请求的操作无法通过HTTP/3提供服务。对等方应该通过HTTP/1.1重试。

格式为 0x1f * N + 0x21(N为非负整数)的错误码被保留,以行使将未知错误码视为等同于H3_NO_ERROR的要求(第9节)。实现应该 (SHOULD) 在本应发送H3_NO_ERROR时以一定概率从此空间中选择错误码。