les caractères autorisés dans les en-tête HTTP valeurs?

Après des études de HTTP/1.1, plus précisément à la page 31 et liées je suis venu à la conclusion que toutes les 8 bits de l'octet peut être présent dans l'en-tête HTTP de la valeur. I. e. tout caractère de code à partir de [0,255].

Et pourtant les serveurs HTTP, j'ai essayé de refuser de prendre quoi que ce soit avec le code > 127 (ou plus US-ASCII non imprimables caractères).

Ici est séchée, extrait de la grammaire utilisée dans la norme:

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>

CR             = <US-ASCII CR, carriage return (13)>
LF             = <US-ASCII LF, linefeed (10)>
SP             = <US-ASCII SP, space (32)>
HT             = <US-ASCII HT, horizontal-tab (9)>
CRLF           = CR LF
LWS            = [CRLF] 1*( SP | HT )
OCTET          = <any 8-bit sequence of data>
CHAR           = <any US-ASCII character (octets 0 - 127)>
CTL            = <any US-ASCII control character (octets 0 - 31) and DEL (127)>
TEXT           = <any OCTET except CTLs, but including LWS>

token          = 1*<any CHAR except CTLs or separators>
separators     = "(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\"
               | <"> | "/" | "[" | "]" | "?" | "=" | "{" | "}" | SP | HT

quoted-string  = ( <"> *(qdtext | quoted-pair ) <"> )
qdtext         = <any TEXT except <">>
quoted-pair    = "\" CHAR

Comme vous pouvez le voir field-content peut être un quoted-string, qui est un enquoted séquence de TEXT (c'est à dire toutes les 8 bits de l'octet à l'exception de " et les valeurs de [0-8, 11-12, 14-31, 127] gamme) ou quoted-pair (\ suivie par une valeur allant de [0, 127] gamme). I. e. tout 8 bits char séquence peut être transmis par fr-le citant et en préfixant les symboles spéciaux avec \).

(À noter que la norme ne permet pas de traiter NUL(0x00) char spéciale)

Mais, de toute évidence, soit tous les serveurs que j'ai essayé ne sont pas conformes ou norme a changé depuis 1999 ou je ne peux pas le lire correctement.

Alors... quels sont les caractères autorisés dans l'en-tête HTTP valeurs et pourquoi?

P. S. la Raison derrière tout cela: je suis à la recherche d'un moyen de passer codé en utf-8 de la séquence d'en-tête HTTP de la valeur (sans autre encodage, si possible).

On dirait que personne a vraiment de la présente partie de la norme au sérieux. J'ai fini par tout simplement les url-encodage valeurs d'en-tête.
Notez que separators dans field-names doivent être encodés. Aussi, si vous utilisez WinHTTP -- vous devrez encoder apostrophe symbole dans field-name, ou à la demande échoue.
Conseil: la RFC 2616 est totalement hors de propos. Reportez-vous à RFC 7230.
Je ne savais pas à propos de la RFC 7230. Est-il un fonctionnaire standard HTTP/1.1? (demander, car greenbytes lien pointe vers un document portant la mention "projet de NORME")
RFC 7230 ne pas réécrire la RFC 2616 - il clarifed heureusement. [tools.ietf.org/html/rfc7230#section-3.2] (§3.2) utilise le jeton VCHAR pour spécifier la limite permise de champ-contenu; VCHAR est défini dans [tools.ietf.org/html/rfc7230#section-1.2] (§1.2), comme visible USASCII caractère. Cela clarifie jeton élimine le besoin de passer du temps à l'abattage des non-caractères visibles comme le RFC 2616, mais ne pas étendre la 1999/1982 définition pour inclure de 128 à 255. L'OP question est "quels sont les caractères autorisés dans l'en-tête HTTP valeurs et pourquoi". J'ai répondu que, avec les références.

OriginalL'auteur C.M. | 2017-12-07