Формат заголовков HTTP определен в спецификации HTTP. Я собираюсь поговорить о HTTP 1.1, для которого спецификация RFC 2616 . В разделе 4.2 «Заголовки сообщений» определена общая структура заголовка:
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>
Это определение опирается на два основных столпа, токен и текст. Оба они определены в разделе 2.2 «Основные правила». Токен это:
token = 1*<any CHAR except CTLs or separators>
В свою очередь опираясь на CHAR, CTL и разделители:
CHAR = <any US-ASCII character (octets 0 - 127)>
CTL = <any US-ASCII control character
(octets 0 - 31) and DEL (127)>
separators = "(" | ")" | "<" | ">" | "@"
| "," | ";" | ":" | "\" | <">
| "/" | "[" | "]" | "?" | "="
| "{" | "}" | SP | HT
ТЕКСТ это:
TEXT = <any OCTET except CTLs,
but including LWS>
Где LWS - линейный пробел, определение которого я не буду воспроизводить, а OCTET:
OCTET = <any 8-bit sequence of data>
Есть примечание, сопровождающее определение:
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].
Итак, два вывода. Во-первых, ясно, что имя заголовка должно состоять из подмножества символов ASCII - буквенно-цифровых символов, некоторой пунктуации, а не чего-то еще. Во- вторых, нет ничего в определении заголовка значения , что накладывает ограничения на это в ASCII или исключает 8-битных символов: это явно состоит из октетов, с символами только управления перемычкой (обратите внимание , что CR и LF рассматриваются элементы управления). Кроме того, комментарий к продукции TEXT подразумевает, что октеты должны интерпретироваться как находящиеся в ISO-8859-1, и что существует механизм кодирования (который, кстати, ужасен) для представления символов вне этой кодировки.
Итак, для ответа на @BalusC, в частности, совершенно ясно, что согласно спецификации значения заголовков приведены в ISO-8859-1. Я отправил символы высокого уровня 8859-1 (в частности, некоторые ударные гласные, как они используются на французском языке) в заголовке из Tomcat, и правильно интерпретировал их Firefox, так что в некоторой степени это работает на практике так же, как и в теории (хотя это был заголовок Location, который содержит URL, и эти символы недопустимы в URL, так что это было фактически недопустимо, но по другому правилу!).
Тем не менее, я бы не стал полагаться на ISO-8859-1, работающий на всех серверах, прокси-серверах и клиентах, поэтому я бы придерживался ASCII в качестве защитного программирования.