O formato para cabeçalhos HTTP é definido na especificação HTTP. Vou falar sobre o HTTP 1.1, para o qual a especificação é RFC 2616 . Na seção 4.2, 'Cabeçalhos da mensagem', a estrutura geral de um cabeçalho é definida:
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>
Essa definição se baseia em dois pilares principais, token e TEXT. Ambos são definidos na seção 2.2, 'Regras básicas'. O token é:
token = 1*<any CHAR except CTLs or separators>
Por sua vez, apoiando-se no CHAR, CTL e nos 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 é:
TEXT = <any OCTET except CTLs,
but including LWS>
Onde LWS é um espaço em branco linear, cuja definição eu não reproduzirei, e OCTET é:
OCTET = <any 8-bit sequence of data>
Há uma nota que acompanha a definição:
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].
Então, duas conclusões. Em primeiro lugar, fica claro que o nome do cabeçalho deve ser composto de um subconjunto de caracteres ASCII - alfanuméricos, alguma pontuação, não muito mais. Segundo, não há nada na definição de um valor de cabeçalho que o restrinja a ASCII ou exclua caracteres de 8 bits: ele é explicitamente composto por octetos, com apenas caracteres de controle barrados (observe que CR e LF são considerados controles). Além disso, o comentário sobre a produção TEXT implica que os octetos devem ser interpretados como estando na ISO-8859-1 e que existe um mecanismo de codificação (que é horrível, aliás) para representar caracteres fora dessa codificação.
Portanto, para responder ao @BalusC em particular, é bastante claro que, de acordo com a especificação, os valores do cabeçalho estão na ISO-8859-1. Enviei caracteres 8859-1 (especificamente, algumas vogais acentuadas usadas em francês) em um cabeçalho do Tomcat e as interpretei corretamente pelo Firefox; portanto, até certo ponto, isso funciona tanto na prática quanto na teoria. (embora esse fosse um cabeçalho de local, que contém um URL e esses caracteres não sejam legais nos URLs, isso era ilegal, mas com uma regra diferente!).
Dito isto, eu não confiaria no funcionamento da ISO-8859-1 em todos os servidores, proxies e clientes; portanto, continuaria com o ASCII como uma questão de programação defensiva.