Quali codifiche sono lo stato HTTP e le linee di intestazione?

1

Se avessi intenzione di scrivere un parser per HTTP, sarei in grado di assumere la codifica delle intestazioni HTTP e della riga di stato? Fino a quando ho letto l'intestazione charset o encoding, come potrei dire quale fosse il tipo di codifica? Ho l'impressione che queste righe saranno sempre in ASCII.

Credo di essere confuso da come HTTP gestisce varie codifiche all'interno dello stesso flusso di dati. Ho l'impressione che la riga di stato e le intestazioni possano essere in una codifica diversa rispetto al corpo. Anche nel caso in cui il corpo sia costituito da dati di modulo multipart, sembra che il corpo abbia una singola codifica. Alcuni chiarimenti / spiegazioni farebbero molta strada.

    
posta Travis Parks 06.12.2015 - 23:14
fonte

1 risposta

8

RFC 7230 , la parte rilevante della versione attuale della specifica, è abbastanza chiaro e al punto:

3. Message Format

[…]
A recipient MUST parse an HTTP message as a sequence of octets in an encoding that is a superset of US-ASCII*. Parsing an HTTP message as a stream of Unicode characters, without regard for the specific encoding, creates security vulnerabilities due to the varying ways that string processing libraries handle invalid multibyte character sequences that contain the octet LF (%x0A).

Ciò consente (almeno) di usare un parser UTF-8 conforme, poiché UTF-8 evita di codificare caratteri di sottoinsieme ASCII confusi nelle sue unità di codice multibyte, quindi ad es. %x0A verrà sempre riconosciuto correttamente come un carattere LF effettivo.

C'è un'altra nota che, dopo aver analizzato con successo il messaggio di base nelle sue coppie chiave-valore intestazione più il corpo del messaggio, puoi iniziare l'analisi dei pezzi con un approccio più rilassato o non predefinito, secondo alcune intestazioni . Ciò è particolarmente utile con l'intestazione Content-Type di RFC 7231 :

3.1.1.1. Media Type

HTTP uses Internet media types [RFC2046] in the Content-Type (Section 3.1.1.5) and Accept (Section 5.3.2) header fields in order to provide open and extensible data typing and type negotiation.

L'RFC2046 si occupa di estendere MIME ai corpi dei messaggi e ha a sua volta una bella sezione chiara su il parametro Charset :

4.1.2. Charset Parameter

A critical parameter that may be specified in the Content-Type field for "text/plain" data is the character set. This is specified with a "charset" parameter, as in:

Content-type: text/plain; charset=iso-8859-1

Continua spiegando che altri tipi di file text/ dovrebbero usare la stessa semantica charset.

Tieni presente che Content-Encoding , Transfer-Encoding e Content-Transfer-Encoding (obsoleto) si riferiscono a un insieme molto limitato di codifiche per set di caratteri di compressione o chunking - non .

* American National Standards Institute, "Coded Character Set - 7-bit American Standard Code for Information Interchange", ANSI X3.4, 1986.

    
risposta data 07.12.2015 - 00:17
fonte

Leggi altre domande sui tag