Réponse courte
Ce n'est pas un code de réponse HTTP, mais il est documenté par WhatWG comme une valeur valide pour l'attribut status d'une XMLHttpRequest
ou d'une réponse Fetch.
D'une manière générale, il s'agit d'une valeur par défaut utilisée lorsqu'il n'y a pas de véritable code d'état HTTP à signaler et / ou qu'une erreur s'est produite lors de l'envoi de la requête ou de la réception de la réponse. Les scénarios possibles dans lesquels tel est le cas incluent, mais sans s'y limiter:
- La demande n'a pas encore été envoyée ou a été abandonnée.
- Le navigateur attend toujours de recevoir l'état de la réponse et les en-têtes.
- La connexion a été interrompue pendant la demande.
- La demande a expiré.
- La demande a rencontré une boucle de redirection infinie.
- Le navigateur connaît l'état de la réponse, mais vous n'êtes pas autorisé à y accéder en raison de restrictions de sécurité liées à la politique de même origine .
Longue réponse
Tout d'abord, pour réitérer: 0 n'est pas un code d'état HTTP. Il y en a une liste complète dans la RFC 7231 Section 6.1 , qui n'inclut pas 0, et l'intro de la section 6 indique clairement que
L'élément status-code est un code entier à trois chiffres
lequel 0 n'est pas.
Cependant, 0 en tant que valeur de l' .status
attribut d'un objet XMLHttpRequest est documenté, bien qu'il soit un peu difficile de retrouver tous les détails pertinents. Nous commençons à https://xhr.spec.whatwg.org/#the-status-attribute , documentant l' .status
attribut, qui déclare simplement:
L' status
attribut doit retourner la réponse de » statut .
Cela peut sembler vide et tautologique, mais en réalité, il y a des informations ici! Rappelez-vous que cette documentation parle ici de l' .response
attribut d'une XMLHttpRequest
réponse, pas d'une réponse, donc cela nous indique que la définition du statut d'un objet XHR est reportée à la définition du statut d'une réponse dans la spécification Fetch.
Mais quel objet de réponse? Et si nous n'avons pas encore reçu de réponse? Le lien en ligne sur le mot «réponse» nous amène à https://xhr.spec.whatwg.org/#response , ce qui explique:
An XMLHttpRequest
a une réponse associée. Sauf indication contraire, il s'agit d'une erreur réseau .
Donc, la réponse dont nous obtenons le statut est par défaut une erreur réseau. Et en recherchant partout où l'expression "définir la réponse à" est utilisée dans la spécification XHR, nous pouvons voir qu'elle est définie à cinq endroits:
À une erreur réseau, lorsque:
À la réponse produite par l'envoi de la demande à l'aide de Fetch, soit par la tâche de réponse de processus Fetch (si la demande XHR est asychronique), soit par la tâche de fin de corps de réponse de processus Fetch (si la demande XHR est synchrone).
En regardant dans la norme Fetch , nous pouvons voir que:
Une erreur réseau est une réponse dont l' état est toujours0
afin que nous puissions immédiatement dire que nous verrons un état de 0 sur un objet XHR dans tous les cas où la spécification XHR indique que la réponse doit être définie sur une erreur réseau. (Fait intéressant, cela inclut le cas où le flux du corps est "erroné", ce qui, selon la spécification Fetch, peut se produire lors de l'analyse du corps après avoir reçu le statut - donc en théorie, je suppose qu'il est possible qu'un objet XHR ait son statut mis à 200, puis rencontrez une erreur de mémoire insuffisante ou quelque chose lors de la réception du corps et modifiez ainsi son état à 0.)
Nous notons également dans la norme Fetch qu'il existe quelques autres types de réponse dont le statut est défini comme étant 0, dont l'existence est liée aux demandes d'origine croisée et à la politique de même origine:
Une réponse filtrée opaque est une réponse filtrée dont le statut 0
... est ...
Une réponse filtrée par redirection opaque est une réponse filtrée dont le statut 0
... est ...
(divers autres détails sur ces deux types de réponse ont été omis).
Mais au-delà de cela, il existe également de nombreux cas où l' algorithme Fetch (plutôt que la spécification XHR, que nous avons déjà examinée) appelle le navigateur à renvoyer une erreur réseau! En effet, l'expression "renvoyer une erreur réseau" apparaît 40 fois dans le standard Fetch. Je n'essaierai pas de lister les 40 ici, mais je note qu'ils comprennent:
- Le cas où le schéma de la requête n'est pas reconnu (par exemple en essayant d'envoyer une requête à madeupscheme: //foobar.com)
- L'instruction merveilleusement vague "En cas de doute, renvoyez une erreur réseau." dans les algorithmes de gestion des URL ftp: // et file: //
- Redirections infinies: "Si le nombre de redirections de la requête est de vingt, renvoie une erreur réseau."
- Un tas de problèmes liés à CORS, tels que "Si la réponse de httpRequest n'est pas" cors "et la vérification de la politique de ressources inter-origines avec les retours de demande et de réponse bloqués, puis renvoie une erreur réseau."
- Échecs de connexion: «Si la connexion échoue, renvoie une erreur réseau».
En d'autres termes: chaque fois que quelque chose ne va pas autre que d'obtenir un vrai code d'état d'erreur HTTP comme un 500 ou 400 du serveur, vous vous retrouvez avec un attribut d'état de 0 sur votre objet XHR ou l'objet de réponse Fetch dans le navigateur. Le nombre de causes spécifiques possibles énumérées dans les spécifications est vaste.
Enfin: si vous êtes intéressé par l'historique de la spécification pour une raison quelconque, notez que cette réponse a été complètement réécrite en 2020, et que vous pourriez être intéressé par la révision précédente de cette réponse , qui a analysé essentiellement les mêmes conclusions de la les spécifications W3 plus anciennes (et beaucoup plus simples) pour XHR, avant qu'elles ne soient remplacées par les spécifications WhatWG plus modernes et plus compliquées auxquelles ces réponses font référence.