Comment interpréter vide en-tête HTTP Accept?
HTTP/1.1 Accept
en-tête de requête est spécifié dans La RFC 2616, l'article 14.1.
C'est la syntaxe est donnée comme ceci:
Accept = "Accept" ":"
#( media-range [ accept-params ] )
#
sans états zéro ou plus selon la section 2.1. Toutefois, l'article 14.1 ne fait aucune déclaration au sujet de la façon d'interpréter un vide Accept
en-tête. Ceci est en contraste à l'article 14.2, qui parle de Accept-Encoding
, où non seulement 1#
est utilisé (un ou plusieurs), mais aussi le cas pour un vide Accept-Encoding
en-tête est spécifiée, qui est une sorte de bizarre. Certains autres sections portant sur les en-têtes de demande sont également spécifiques sur le cas particulier d'une valeur vide.
Doit-on traiter un vide Accept
en-tête de manière équivalente à un inexistante Accept
en-tête? Existe-il des ressources officielles sur ce que j'ai manqué?
Vous devez vous connecter pour publier un commentaire.
De RFC2616 Sec4.2:
À première vue, cela semble pour mettre les messages qui spécifient vide de valeurs d'en-tête dans le mal formé, non-conformes à la catégorie. Cependant, l'augmentation de la BNF forme décrite dans RFC2616 Sec2.1 indique que
Que c'est la déclaration utilisé pour spécifier l'en-tête Accept valeurs, il apparaît que les valeurs vides sont valides.
Analyse de vide en-têtes et les en-têtes avec rien mais des espaces peut être problématique en raison de la direction suivante à partir de la spécification:
À mon humble avis, l'envoi d'un vide-tête est complètement inutile. Il ne devrait pas être fait, et les analyseurs ne peut pas analyser correctement ces en-têtes. Traditionnellement, les gens qui veulent contourner ces limitations lorsque vous traitez avec des pièces non conformes avez spécifié "pseudo-vide" valeurs comme ceci:
X-MyCustomHeader: ""
Si vous voulez tout simplement pour vérifier si un champ d'en-tête a été envoyé comme une certaine forme de commutateur booléen, envisager l'envoi d'une valeur de l'espace réservé comme ci-dessus au lieu d'une valeur vide.
Mise à jour
Je suppose que je n'étais pas très clair à répondre directement à la question: dans le cas d'un vide-tête Accept-vous vraiment avez deux options:
406 Not Acceptable
réponse à informer le client que vous n'offrez pas les types de contenu pour un vide Accepter la valeur (duh).C'est justifié, mais pas exigée par RFC2616 Sec14.1:
Accept:
valeur (si le message de rejet n'est pas une option), les mêmes queAccept: */*
.*/*
, ce qui semble raisonnable pour moi aussi. Merci de prendre le temps!400 Bad Request
serait plus approprié que406 Not Acceptable
, au moins si nous supposons que c'est une violation de la spécification. Cause dans cette affaire, nous avons été incapables de comprendre ce que le client accepte.#element
formulaire n'indiquent vide de valeurs d'en-tête sont d'accord. Je vais mettre à jour ma réponse à en tenir compte, et d'éviter la désinformation. Aussi, je pense que ce fait soit une 406 de réponse ou de traiter commeAccept: */*
valide. Mais probablement pas un 400 puisqu'il n'est pas techniquement un message d'erreur.406
route ou le*/*
route, je pense que se résume à votre préférence entre exactitude et la robustesse dans ce cas. Il semble que ce soit valide du point de vue de la spec est concerné.Accept
est le seul spécifié avec#element
. Tous les autres, à définir précisément1#element
. Je me demande pourquoi? Il ne fait pas beaucoup de sens pour moi que de l'autre l'acceptation des en-têtes de suivre le même format (où q-valeurs et les délimiteurs sont concernés). C'est intéressant, mais sur la surface, il semble comme un échec dans le spec-design afin d'avoir cette incohérence. Peut-être que je me trompe, mais je ne vois pas dans quel but il pourrait servir à permettre à 0 --> nAccept
définitions tête.400
de façon inappropriée à nouveau, car il est#
et pas1#
...Selon http://tools.ietf.org/html/rfc7231#section-5.3.2:
Vous devez traiter un inexistante
Accept
en-tête comme*/*
.