8. Gestion des erreurs (Error Handling)
Lorsqu'un flux ne peut pas être complété avec succès, QUIC permet à l'application de terminer (réinitialiser) brusquement ce flux et de communiquer une raison ; voir la section 2.4 de [QUIC-TRANSPORT]. Ceci est appelé une "erreur de flux (Stream Error)". Une implémentation HTTP/3 peut décider de fermer un flux QUIC et de communiquer le type d'erreur. Les encodages filaires des codes d'erreur sont définis dans la section 8.1. Les erreurs de flux sont distinctes des codes d'état HTTP qui indiquent des conditions d'erreur. Les erreurs de flux indiquent que l'expéditeur n'a pas transféré ou consommé la requête ou la réponse complète, tandis que les codes d'état HTTP indiquent le résultat d'une requête qui a été reçue avec succès.
Si une connexion entière doit être terminée, QUIC fournit de manière similaire des mécanismes pour communiquer une raison ; voir la section 5.3 de [QUIC-TRANSPORT]. Ceci est appelé une "erreur de connexion (Connection Error)". Semblable aux erreurs de flux, une implémentation HTTP/3 peut terminer une connexion QUIC et communiquer la raison en utilisant un code d'erreur de la section 8.1.
Bien que les raisons de fermeture des flux et des connexions soient appelées "erreurs", ces actions n'indiquent pas nécessairement un problème avec la connexion ou l'une ou l'autre implémentation. Par exemple, un flux peut être réinitialisé si la ressource demandée n'est plus nécessaire.
Un point de terminaison PEUT (MAY) choisir de traiter une erreur de flux comme une erreur de connexion dans certaines circonstances, en fermant la connexion entière en réponse à une condition sur un seul flux. Les implémentations doivent considérer l'impact sur les requêtes en cours avant de faire ce choix.
Parce que de nouveaux codes d'erreur peuvent être définis sans négociation (voir la section 9), l'utilisation d'un code d'erreur dans un contexte inattendu ou la réception d'un code d'erreur inconnu DOIT (MUST) être traitée comme équivalente à H3_NO_ERROR. Cependant, la fermeture d'un flux peut avoir d'autres effets indépendamment du code d'erreur ; par exemple, voir la section 4.1.
8.1. Codes d'erreur HTTP/3 (HTTP/3 Error Codes)
Les codes d'erreur suivants sont définis pour une utilisation lors de la terminaison brusque de flux, de l'abandon de la lecture de flux ou de la fermeture immédiate de connexions HTTP/3.
H3_NO_ERROR (0x0100)
Aucune erreur. Utilisé lorsque la connexion ou le flux doit être fermé, mais qu'il n'y a pas d'erreur à signaler.
H3_GENERAL_PROTOCOL_ERROR (0x0101)
Le pair a violé les exigences du protocole d'une manière qui ne correspond pas à un code d'erreur plus spécifique ou le point de terminaison refuse d'utiliser le code d'erreur plus spécifique.
H3_INTERNAL_ERROR (0x0102)
Une erreur interne s'est produite dans la pile HTTP.
H3_STREAM_CREATION_ERROR (0x0103)
Le point de terminaison a détecté que son pair a créé un flux qu'il n'acceptera pas.
H3_CLOSED_CRITICAL_STREAM (0x0104)
Un flux requis par la connexion HTTP/3 a été fermé ou réinitialisé.
H3_FRAME_UNEXPECTED (0x0105)
Une trame a été reçue qui n'était pas autorisée dans l'état actuel ou sur le flux actuel.
H3_FRAME_ERROR (0x0106)
Une trame qui ne satisfait pas les exigences de disposition ou avec une taille invalide a été reçue.
H3_EXCESSIVE_LOAD (0x0107)
Le point de terminaison a détecté que son pair présente un comportement qui pourrait générer une charge excessive.
H3_ID_ERROR (0x0108)
Un ID de flux ou un ID de poussée a été utilisé incorrectement, par exemple en dépassant une limite, en réduisant une limite ou en étant réutilisé.
H3_SETTINGS_ERROR (0x0109)
Un point de terminaison a détecté une erreur dans la charge utile d'une trame SETTINGS.
H3_MISSING_SETTINGS (0x010a)
Aucune trame SETTINGS n'a été reçue au début du flux de contrôle.
H3_REQUEST_REJECTED (0x010b)
Un serveur a rejeté une requête sans effectuer de traitement d'application.
H3_REQUEST_CANCELLED (0x010c)
La requête ou sa réponse (y compris la réponse poussée) est annulée.
H3_REQUEST_INCOMPLETE (0x010d)
Le flux du client s'est terminé sans contenir une requête complètement formée.
H3_MESSAGE_ERROR (0x010e)
Un message HTTP était mal formé et ne peut pas être traité.
H3_CONNECT_ERROR (0x010f)
La connexion TCP établie en réponse à une requête CONNECT a été réinitialisée ou fermée anormalement.
H3_VERSION_FALLBACK (0x0110)
L'opération demandée ne peut pas être servie sur HTTP/3. Le pair devrait réessayer sur HTTP/1.1.
Les codes d'erreur au format 0x1f * N + 0x21 pour des valeurs entières non négatives de N sont réservés pour exercer l'exigence que les codes d'erreur inconnus soient traités comme équivalents à H3_NO_ERROR (section 9). Les implémentations DEVRAIENT (SHOULD) sélectionner un code d'erreur de cet espace avec une certaine probabilité lorsqu'elles auraient envoyé H3_NO_ERROR.