Les en-têtes HTTP sont-ils sensibles à la casse?

Dans un article de blog, j’utilise le code PHP suivant pour définir le type de contenu d’une réponse:

header('content-type: application/json; charset=utf-8'); 

Je viens de recevoir un commentaire sur cet article en disant que le content-type doit être en majuscule, Content-type . Est-ce correct? Cela semble fonctionner pour moi avec toutes les minuscules, et j’ai supposé que les en-têtes HTTP étaient insensibles à la casse. Ou ça marche simplement parce que les navigateurs sont sympas?

Les noms d’en-tête ne sont pas sensibles à la casse.

De RFC 2616 – “Protocole de transfert hypertexte – HTTP / 1.1” , Section 4.2, “En-têtes de message” :

Chaque champ d’en-tête est composé d’un nom suivi de deux points (“:”) et de la valeur du champ. Les noms de champs sont insensibles à la casse.

La mise à jour RFC 7230 ne répertorie aucune modification de la RFC 2616 à cette partie.

Les noms d’en-tête HTTP sont insensibles à la casse, conformément à la RFC 2616 :

4.2:

Chaque champ d’en-tête est composé d’un nom suivi de deux points (“:”) et de la valeur du champ. Les noms de champs sont insensibles à la casse.

(Les valeurs de champ peuvent ou non être sensibles à la casse.)

Si vous faites confiance aux principaux navigateurs, vous êtes tous prêts.


BTW, contrairement à la plupart des HTTP, les méthodes (verbes) sont sensibles à la casse:

5.1.1 Méthode

Le jeton de méthode indique la méthode à effectuer sur le
ressource identifiée par l’URI de demande. La méthode est sensible à la casse.

  Method = "OPTIONS" ; Section 9.2 | "GET" ; Section 9.3 | "HEAD" ; Section 9.4 | "POST" ; Section 9.5 | "PUT" ; Section 9.6 | "DELETE" ; Section 9.7 | "TRACE" ; Section 9.8 | "CONNECT" ; Section 9.9 | extension-method extension-method = token 

tldr; Les en-têtes HTTP / 1.1 et HTTP / 2 sont insensibles à la casse.

Selon RFC 7230 (HTTP / 1.1):

Chaque champ d’en-tête est composé d’un nom de champ insensible à la casse suivi de deux points (“:”), d’un espace blanc de début facultatif, de la valeur du champ et des espaces de fin facultatifs.

https://tools.ietf.org/html/rfc7230#section-3.2

Aussi, RFC 7540 (HTTP / 2):

Comme dans HTTP / 1.x, les noms de champs d’en-tête sont des chaînes de caractères ASCII.
caractères qui sont comparés d’une manière insensible à la casse.

https://tools.ietf.org/html/rfc7540#section-8.1.2

header('Content-type: image/png') ne fonctionnait pas avec PHP 5.5 desservant IE11, car le stream d’images était affiché sous forme de texte

header('Content-Type: image/png') fonctionnait, comme dans l’image apparaissant comme une image

La seule différence est le capital ‘T’.

La RFC pour HTTP (citée ci-dessus) stipule que les en-têtes ne sont pas sensibles à la casse, mais vous verrez que certains navigateurs (je vous regarde, IE) considèrent que la majuscule de chacun des mots est la meilleure:

 Location: http://stackoverflow.com Content-Type: text/plain 

contre

 location: http://stackoverflow.com content-type: text/plain 

Ce n’est pas un standard “HTTP”, mais juste une autre des bizarreries du navigateur, nous en tant que développeurs, devons réfléchir.