Le format des en-têtes HTTP est défini dans la spécification HTTP. Je vais parler de HTTP 1.1, dont la spécification est RFC 2616 . Dans la section 4.2, «En-têtes de message», la structure générale d'un en-tête est définie:
message-header = field-name ":" [ field-value ]
field-name = token
field-value = *( field-content | LWS )
field-content = <the OCTETs making up the field-value
and consisting of either *TEXT or combinations
of token, separators, and quoted-string>
Cette définition repose sur deux piliers principaux, le jeton et le TEXTE. Les deux sont définis dans la section 2.2, «Règles de base». Le jeton est:
token = 1*<any CHAR except CTLs or separators>
À son tour reposant sur CHAR, CTL et séparateurs:
CHAR = <any US-ASCII character (octets 0 - 127)>
CTL = <any US-ASCII control character
(octets 0 - 31) and DEL (127)>
separators = "(" | ")" | "<" | ">" | "@"
| "," | ";" | ":" | "\" | <">
| "/" | "[" | "]" | "?" | "="
| "{" | "}" | SP | HT
TEXT c'est:
TEXT = <any OCTET except CTLs,
but including LWS>
Où LWS est un espace blanc linéaire, dont je ne reproduirai pas la définition, et OCTET est:
OCTET = <any 8-bit sequence of data>
Une note accompagne la définition:
The TEXT rule is only used for descriptive field contents and values
that are not intended to be interpreted by the message parser. Words
of *TEXT MAY contain characters from character sets other than ISO-
8859-1 [22] only when encoded according to the rules of RFC 2047
[14].
Donc, deux conclusions. Tout d'abord, il est clair que le nom de l'en-tête doit être composé d'un sous-ensemble de caractères ASCII - alphanumériques, une certaine ponctuation, pas beaucoup d'autre. Deuxièmement, rien dans la définition d'une valeur d'en- tête ne la restreint à ASCII ou exclut les caractères 8 bits: elle est explicitement composée d'octets, avec uniquement des caractères de contrôle interdits (notez que CR et LF sont considérés comme des contrôles). En outre, le commentaire sur la production TEXT implique que les octets doivent être interprétés comme étant en ISO-8859-1, et qu'il existe un mécanisme de codage (ce qui est horrible, d'ailleurs) pour représenter les caractères en dehors de ce codage.
Donc, pour répondre à @BalusC en particulier, il est assez clair que selon la spécification, les valeurs d'en-tête sont en ISO-8859-1. J'ai envoyé des caractères haut 8859-1 (en particulier, certaines voyelles accentuées utilisées en français) dans un en-tête à partir de Tomcat, et les ai fait interpréter correctement par Firefox, donc dans une certaine mesure, cela fonctionne dans la pratique ainsi qu'en théorie (bien qu'il s'agisse d'un en-tête Emplacement, qui contient une URL, et que ces caractères ne sont pas autorisés dans les URL, c'était en fait illégal, mais sous une règle différente!).
Cela dit, je ne compterais pas sur ISO-8859-1 pour tous les serveurs, proxys et clients, je m'en tiendrai donc à l'ASCII pour une programmation défensive.