8. Fehlerbehandlung (Error Handling)
Wenn ein Stream nicht erfolgreich abgeschlossen werden kann, erlaubt QUIC der Anwendung, diesen Stream abrupt zu beenden (zurückzusetzen) und einen Grund zu kommunizieren; siehe Abschnitt 2.4 von [QUIC-TRANSPORT]. Dies wird als "Stream-Fehler (Stream Error)" bezeichnet. Eine HTTP/3-Implementierung kann entscheiden, einen QUIC-Stream zu schließen und den Fehlertyp zu kommunizieren. Drahtcodierungen von Fehlercodes sind in Abschnitt 8.1 definiert. Stream-Fehler unterscheiden sich von HTTP-Statuscodes, die Fehlerbedingungen anzeigen. Stream-Fehler zeigen an, dass der Absender die vollständige Anfrage oder Antwort nicht übertragen oder verarbeitet hat, während HTTP-Statuscodes das Ergebnis einer erfolgreich empfangenen Anfrage anzeigen.
Wenn eine gesamte Verbindung beendet werden muss, bietet QUIC ähnlich Mechanismen zur Kommunikation eines Grundes; siehe Abschnitt 5.3 von [QUIC-TRANSPORT]. Dies wird als "Verbindungsfehler (Connection Error)" bezeichnet. Ähnlich wie bei Stream-Fehlern kann eine HTTP/3-Implementierung eine QUIC-Verbindung beenden und den Grund unter Verwendung eines Fehlercodes aus Abschnitt 8.1 kommunizieren.
Obwohl die Gründe für das Schließen von Streams und Verbindungen "Fehler" genannt werden, weisen diese Aktionen nicht notwendigerweise auf ein Problem mit der Verbindung oder einer der Implementierungen hin. Beispielsweise kann ein Stream zurückgesetzt werden, wenn die angeforderte Ressource nicht mehr benötigt wird.
Ein Endpunkt KANN (MAY) unter bestimmten Umständen einen Stream-Fehler als Verbindungsfehler behandeln und die gesamte Verbindung als Reaktion auf eine Bedingung in einem einzelnen Stream schließen. Implementierungen müssen die Auswirkungen auf ausstehende Anfragen berücksichtigen, bevor sie diese Wahl treffen.
Da neue Fehlercodes ohne Verhandlung definiert werden können (siehe Abschnitt 9), MUSS (MUST) die Verwendung eines Fehlercodes in einem unerwarteten Kontext oder der Empfang eines unbekannten Fehlercodes als gleichwertig mit H3_NO_ERROR behandelt werden. Das Schließen eines Streams kann jedoch unabhängig vom Fehlercode andere Auswirkungen haben; siehe beispielsweise Abschnitt 4.1.
8.1. HTTP/3-Fehlercodes (HTTP/3 Error Codes)
Die folgenden Fehlercodes sind für die Verwendung beim abrupten Beenden von Streams, beim Abbrechen des Lesens von Streams oder beim sofortigen Schließen von HTTP/3-Verbindungen definiert.
H3_NO_ERROR (0x0100)
Kein Fehler. Wird verwendet, wenn die Verbindung oder der Stream geschlossen werden muss, aber kein Fehler zu signalisieren ist.
H3_GENERAL_PROTOCOL_ERROR (0x0101)
Der Peer hat Protokollanforderungen auf eine Weise verletzt, die keinem spezifischeren Fehlercode entspricht, oder der Endpunkt lehnt die Verwendung des spezifischeren Fehlercodes ab.
H3_INTERNAL_ERROR (0x0102)
Im HTTP-Stack ist ein interner Fehler aufgetreten.
H3_STREAM_CREATION_ERROR (0x0103)
Der Endpunkt hat festgestellt, dass sein Peer einen Stream erstellt hat, den er nicht akzeptieren wird.
H3_CLOSED_CRITICAL_STREAM (0x0104)
Ein für die HTTP/3-Verbindung erforderlicher Stream wurde geschlossen oder zurückgesetzt.
H3_FRAME_UNEXPECTED (0x0105)
Es wurde ein Frame empfangen, der im aktuellen Zustand oder auf dem aktuellen Stream nicht zulässig war.
H3_FRAME_ERROR (0x0106)
Es wurde ein Frame empfangen, der die Layout-Anforderungen nicht erfüllt oder eine ungültige Größe hat.
H3_EXCESSIVE_LOAD (0x0107)
Der Endpunkt hat festgestellt, dass sein Peer ein Verhalten zeigt, das möglicherweise übermäßige Last erzeugt.
H3_ID_ERROR (0x0108)
Eine Stream-ID oder Push-ID wurde falsch verwendet, z. B. durch Überschreiten eines Limits, Reduzieren eines Limits oder Wiederverwendung.
H3_SETTINGS_ERROR (0x0109)
Ein Endpunkt hat einen Fehler in der Nutzlast eines SETTINGS-Frames erkannt.
H3_MISSING_SETTINGS (0x010a)
Am Anfang des Kontrollstreams wurde kein SETTINGS-Frame empfangen.
H3_REQUEST_REJECTED (0x010b)
Ein Server hat eine Anfrage abgelehnt, ohne Anwendungsverarbeitung durchzuführen.
H3_REQUEST_CANCELLED (0x010c)
Die Anfrage oder ihre Antwort (einschließlich gepushter Antwort) wird abgebrochen.
H3_REQUEST_INCOMPLETE (0x010d)
Der Stream des Clients wurde beendet, ohne eine vollständig geformte Anfrage zu enthalten.
H3_MESSAGE_ERROR (0x010e)
Eine HTTP-Nachricht war fehlerhaft und kann nicht verarbeitet werden.
H3_CONNECT_ERROR (0x010f)
Die als Reaktion auf eine CONNECT-Anfrage hergestellte TCP-Verbindung wurde zurückgesetzt oder abnormal geschlossen.
H3_VERSION_FALLBACK (0x0110)
Die angeforderte Operation kann nicht über HTTP/3 bereitgestellt werden. Der Peer sollte über HTTP/1.1 erneut versuchen.
Fehlercodes im Format 0x1f * N + 0x21 für nichtnegative ganzzahlige Werte von N sind reserviert, um die Anforderung zu erfüllen, dass unbekannte Fehlercodes als gleichwertig mit H3_NO_ERROR behandelt werden (Abschnitt 9). Implementierungen SOLLTEN (SHOULD) mit einer gewissen Wahrscheinlichkeit einen Fehlercode aus diesem Bereich auswählen, wenn sie H3_NO_ERROR gesendet hätten.