Il formato per le intestazioni HTTP è definito nelle specifiche HTTP. Parlerò di HTTP 1.1, per il quale la specifica è RFC 2616 . Nella sezione 4.2, "Intestazioni dei messaggi", viene definita la struttura generale di un'intestazione:
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>
Questa definizione si basa su due pilastri principali, token e TEXT. Entrambi sono definiti nella sezione 2.2, "Regole di base". Il token è:
token = 1*<any CHAR except CTLs or separators>
A sua volta appoggiato su CHAR, CTL e separatori:
CHAR = <any US-ASCII character (octets 0 - 127)>
CTL = <any US-ASCII control character
(octets 0 - 31) and DEL (127)>
separators = "(" | ")" | "<" | ">" | "@"
| "," | ";" | ":" | "\" | <">
| "/" | "[" | "]" | "?" | "="
| "{" | "}" | SP | HT
TESTO è:
TEXT = <any OCTET except CTLs,
but including LWS>
Dove LWS è uno spazio bianco lineare, la cui definizione non riprodurrò, e OCTET è:
OCTET = <any 8-bit sequence of data>
C'è una nota che accompagna la definizione:
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].
Quindi, due conclusioni. Innanzitutto, è chiaro che il nome dell'intestazione deve essere composto da un sottoinsieme di caratteri ASCII: alfanumerici, alcuni segni di punteggiatura, non molto altro. In secondo luogo, non esiste nulla nella definizione di un valore di intestazione che lo limiti a ASCII o esclude caratteri a 8 bit: è esplicitamente composto da ottetti, con solo caratteri di controllo esclusi (si noti che CR e LF sono considerati controlli). Inoltre, il commento sulla produzione TEXT implica che gli ottetti devono essere interpretati come in ISO-8859-1 e che esiste un meccanismo di codifica (che è orribile, per inciso) per rappresentare personaggi al di fuori di quella codifica.
Quindi, per rispondere a @BalusC in particolare, è abbastanza chiaro che secondo le specifiche, i valori di intestazione sono in ISO-8859-1. Ho inviato caratteri alti 8859-1 (in particolare alcune vocali accentate usate in francese) in un'intestazione di Tomcat e li ho interpretati correttamente da Firefox, quindi, in una certa misura, funziona sia in pratica che in teoria (sebbene questa fosse un'intestazione Location, che contiene un URL, e questi caratteri non sono legali negli URL, quindi questo era in realtà illegale, ma con una regola diversa!).
Detto questo, non farei affidamento sul fatto che ISO-8859-1 funzioni su tutti i server, i proxy e i client, quindi mi atterrerei all'ASCII come una questione di programmazione difensiva.