2. Panoramica del processo di compressione (Compression Process Overview)
Questa specifica non descrive un algoritmo specifico per un encoder. Invece, definisce precisamente come un decoder è tenuto a operare, permettendo agli encoder di produrre qualsiasi codifica che questa definizione consenta.
2.1. Ordine della lista di intestazioni (Header List Ordering)
HPACK preserva l'ordine dei campi di intestazione all'interno della lista di intestazioni. Un encoder DEVE ordinare le rappresentazioni dei campi di intestazione nel blocco di intestazioni secondo il loro ordine nella lista di intestazioni originale. Un decoder DEVE ordinare i campi di intestazione nella lista di intestazioni decodificata secondo il loro ordine nel blocco di intestazioni.
2.2. Contesti di codifica e decodifica (Encoding and Decoding Contexts)
Per decomprimere i blocchi di intestazioni, un decoder deve solo mantenere una tabella dinamica (vedi Sezione 2.3.2) come contesto di decodifica. Non è necessario alcun altro stato dinamico.
Quando utilizzato per comunicazione bidirezionale, come in HTTP, le tabelle dinamiche di codifica e decodifica mantenute da un endpoint sono completamente indipendenti, cioè le tabelle dinamiche di richiesta e risposta sono separate.
2.3. Tabelle di indicizzazione (Indexing Tables)
HPACK utilizza due tabelle per associare i campi di intestazione agli indici. La tabella statica (vedi Sezione 2.3.1) è predefinita e contiene campi di intestazione comuni (la maggior parte di essi con un valore vuoto). La tabella dinamica (vedi Sezione 2.3.2) è dinamica e può essere utilizzata dall'encoder per indicizzare i campi di intestazione ripetuti nelle liste di intestazioni codificate.
Queste due tabelle sono combinate in un singolo spazio di indirizzamento per definire i valori di indice (vedi Sezione 2.3.3).
2.3.1. Tabella statica (Static Table)
La tabella statica consiste in una lista statica predefinita di campi di intestazione. Le sue voci sono definite nell'Appendice A.
2.3.2. Tabella dinamica (Dynamic Table)
La tabella dinamica consiste in una lista di campi di intestazione mantenuta in ordine first-in, first-out. La prima e più recente voce in una tabella dinamica è all'indice più basso, e la voce più vecchia di una tabella dinamica è all'indice più alto.
La tabella dinamica è inizialmente vuota. Le voci vengono aggiunte man mano che ogni blocco di intestazioni viene decompresso.
La tabella dinamica può contenere voci duplicate (cioè voci con lo stesso nome e lo stesso valore). Pertanto, le voci duplicate NON DEVONO essere trattate come un errore da un decoder.
L'encoder decide come aggiornare la tabella dinamica e può quindi controllare quanta memoria viene utilizzata dalla tabella dinamica. Per limitare i requisiti di memoria del decoder, la dimensione della tabella dinamica è strettamente limitata (vedi Sezione 4.2).
Il decoder aggiorna la tabella dinamica durante l'elaborazione di una lista di rappresentazioni di campi di intestazione (vedi Sezione 3.2).
2.3.3. Spazio di indirizzamento degli indici (Index Address Space)
La tabella statica e la tabella dinamica sono combinate in un singolo spazio di indirizzamento degli indici.
Gli indici tra 1 e la lunghezza della tabella statica (inclusi) si riferiscono agli elementi nella tabella statica (vedi Sezione 2.3.1).
Gli indici strettamente maggiori della lunghezza della tabella statica si riferiscono agli elementi nella tabella dinamica (vedi Sezione 2.3.2). La lunghezza della tabella statica viene sottratta per trovare l'indice nella tabella dinamica.
Gli indici strettamente maggiori della somma delle lunghezze di entrambe le tabelle DEVONO essere trattati come un errore di decodifica.
2.4. Rappresentazione del campo di intestazione (Header Field Representation)
Un campo di intestazione codificato può essere rappresentato come un indice o come un letterale.
Una rappresentazione indicizzata (Indexed Representation) definisce un campo di intestazione come un riferimento a una voce nella tabella statica o nella tabella dinamica (vedi Sezione 6.1).
Una rappresentazione letterale (Literal Representation) definisce un campo di intestazione specificandone il nome e il valore. Il nome del campo di intestazione può essere rappresentato letteralmente o come un riferimento a una voce nella tabella statica o nella tabella dinamica. Il valore del campo di intestazione è rappresentato letteralmente.
Sono definite tre diverse rappresentazioni letterali:
-
Una rappresentazione letterale che aggiunge il campo di intestazione come nuova voce all'inizio della tabella dinamica (vedi Sezione 6.2.1).
-
Una rappresentazione letterale che non aggiunge il campo di intestazione alla tabella dinamica (vedi Sezione 6.2.2).
-
Una rappresentazione letterale che non aggiunge il campo di intestazione alla tabella dinamica, con la stipulazione aggiuntiva che questo campo di intestazione utilizzi sempre una rappresentazione letterale, in particolare quando viene ricodificato da un intermediario (vedi Sezione 6.2.3). Questa rappresentazione è destinata a proteggere i valori dei campi di intestazione che non devono essere messi a rischio comprimendoli (vedi Sezione 7.1.3 per ulteriori dettagli).
La scelta di una di queste rappresentazioni letterali può essere guidata da considerazioni sulla sicurezza, al fine di proteggere i valori dei campi di intestazione sensibili (vedi Sezione 7.1).