8. エラー処理 (Error Handling)
ストリームが正常に完了できない場合、QUICはアプリケーションがそのストリームを突然終了(リセット)し、理由を伝達することを許可します。これは「ストリームエラー (Stream Error)」と呼ばれます。HTTP/3実装は、QUICストリームを閉じてエラーのタイプを伝達することを決定できます。エラーコードのワイヤエンコーディングはセクション8.1で定義されています。ストリームエラーは、エラー条件を示すHTTPステータスコードとは異なります。ストリームエラーは、送信者が完全なリクエストまたはレスポンスを転送または消費しなかったことを示し、HTTPステータスコードは正常に受信されたリクエストの結果を示します。
接続全体を終了する必要がある場合、QUICは同様に理由を伝達するメカニズムを提供します。これは「接続エラー (Connection Error)」と呼ばれます。ストリームエラーと同様に、HTTP/3実装はQUIC接続を終了し、セクション8.1のエラーコードを使用して理由を伝達できます。
ストリームと接続を閉じる理由は「エラー」と呼ばれますが、これらのアクションは必ずしも接続またはいずれかの実装に問題があることを示すものではありません。たとえば、要求されたリソースが不要になった場合、ストリームをリセットできます。
特定の状況下で、エンドポイントはストリームエラーを接続エラーとして扱うことを選択できます (MAY)。この選択を行う前に、実装は未完了のリクエストへの影響を考慮する必要があります。
新しいエラーコードは交渉なしで定義できるため(セクション9参照)、予期しないコンテキストでのエラーコードの使用または未知のエラーコードの受信は、H3_NO_ERRORと同等として扱わなければなりません (MUST)。ただし、ストリームを閉じると、エラーコードに関係なく他の影響が生じる可能性があります。たとえば、セクション4.1を参照してください。
8.1. HTTP/3エラーコード (HTTP/3 Error Codes)
以下のエラーコードは、ストリームを突然終了する、ストリームの読み取りを中止する、または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)。実装は、H3_NO_ERRORを送信する予定だった場合、ある程度の確率でこのスペースからエラーコードを選択すべきです (SHOULD)。