El formato para los encabezados HTTP se define en la especificación HTTP. Voy a hablar sobre HTTP 1.1, cuya especificación es RFC 2616 . En la sección 4.2, 'Encabezados de mensajes', se define la estructura general de un encabezado:
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>
Esta definición se basa en dos pilares principales, token y TEXT. Ambos se definen en la sección 2.2, 'Reglas básicas'. Token es:
token = 1*<any CHAR except CTLs or separators>
A su vez descansa sobre CHAR, CTL y separadores:
CHAR = <any US-ASCII character (octets 0 - 127)>
CTL = <any US-ASCII control character
(octets 0 - 31) and DEL (127)>
separators = "(" | ")" | "<" | ">" | "@"
| "," | ";" | ":" | "\" | <">
| "/" | "[" | "]" | "?" | "="
| "{" | "}" | SP | HT
TEXTO es:
TEXT = <any OCTET except CTLs,
but including LWS>
Donde LWS es un espacio en blanco lineal, cuya definición no reproduciré, y OCTET es:
OCTET = <any 8-bit sequence of data>
Hay una nota que acompaña a la definición:
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].
Entonces, dos conclusiones. En primer lugar, está claro que el nombre del encabezado debe estar compuesto de un subconjunto de caracteres ASCII: alfanuméricos, algunos signos de puntuación, no mucho más. En segundo lugar, no hay nada en la definición de un valor de encabezado que lo restrinja a ASCII o excluya caracteres de 8 bits: está compuesto explícitamente de octetos, con solo caracteres de control excluidos (tenga en cuenta que CR y LF se consideran controles). Además, el comentario sobre la producción de TEXT implica que los octetos deben interpretarse como si estuvieran en ISO-8859-1, y que existe un mecanismo de codificación (que es horrible, por cierto) para representar caracteres fuera de esa codificación.
Entonces, para responder a @BalusC en particular, está bastante claro que de acuerdo con la especificación, los valores de encabezado están en ISO-8859-1. Envié caracteres de alto 8859-1 (específicamente, algunas vocales acentuadas como se usan en francés) en un encabezado de Tomcat, y Firefox las interpretó correctamente, por lo que, en cierta medida, esto funciona tanto en la práctica como en la teoría. (aunque este era un encabezado de ubicación, que contiene una URL, y estos caracteres no son legales en las URL, por lo que en realidad era ilegal, ¡pero bajo una regla diferente!).
Dicho esto, no confiaría en que ISO-8859-1 funcione en todos los servidores, servidores proxy y clientes, por lo que me apegaría a ASCII como una cuestión de programación defensiva.